Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Whats easiest way to use filter_horizontal outside of the Admin in Django

I have a non-admin form in which I'd like to use filter_horizontal on. I have read this which does much more than what I want (I only want the filter_horizontal). I wanted to check to see if anyone has come up with a simpler (more current) way to just implement the filter_horizontal.

So here is the code:

class County(models.Model):
    """County Names"""
    name = models.CharField(max_length=64)
    state = USStateField(null=True)

class Company(models.Model):
    """The basics of a company"""
    name = models.CharField(max_length = 100)
    counties = models.ManyToManyField(County,blank=True, null=True)

Then our form currently look like this. I thought this would work..

from django.contrib.admin.widgets import FilteredSelectMultiple
class RaterCompanyForm(ModelForm):
    class Meta:
        model = RaterOrganization
        exclude = ('remrate_projects',)
        widgets = {'counties': FilteredSelectMultiple(verbose_name="Counties",
                                                      is_stacked=True,) }
    class Media:
        css = {'all':['admin/css/widgets.css']}
        js = ['/admin/jsi18n/']

BTW: I understand this may be a duplicate of this but his question wasn't answered. I've done plenty of homework here and here but neither of these appear to work.

like image 805
rh0dium Avatar asked Oct 15 '11 13:10

rh0dium


People also ask

Is Django Admin necessary?

Show activity on this post. No. The django admin is not intended for any end-user. The django admin feature is intended to assist the website developer, and that is all.

Is Django admin good for production?

Django's Admin is amazing. A built-in and fully functional interface that quickly gets in and allows data entry is priceless. Developers can focus on building additional functionality instead of creating dummy interfaces to interact with the database.


1 Answers

I know this thread is old, but hopefully this info will help someone else who stumbles upon this page like I did.

After much pain and suffering, I was able to get this to work with Django 1.4. Like rh0dium, I tried all those articles, but had to make a lot of tweaks.

You don't have to do anything special with the ModelForm, but you do have to include all these js and css files in the template:

<script type="text/javascript" src="/admin/jsi18n/"></script>
<script type="text/javascript" src="{{ STATIC_URL }}admin/js/core.js"></script>
<script type="text/javascript" src="{{ STATIC_URL }}admin/js/jquery.min.js"></script>
<script type="text/javascript" src="{{ STATIC_URL }}admin/js/jquery.init.js"></script>
<script type="text/javascript" src="{{ STATIC_URL }}admin/js/SelectFilter2.js"></script>
<script type="text/javascript" src="{{ STATIC_URL }}admin/js/SelectBox.js"></script>

<link rel="stylesheet" type="text/css" href="{{ STATIC_URL }}admin/css/widgets.css"/>
<link rel="stylesheet" type="text/css" href="{{ STATIC_URL }}admin/css/base.css"/>
<link rel="stylesheet" type="text/css" href="{{ STATIC_URL }}admin/css/forms.css"/>

Then render the form as you normally would, but you need to get the fieldset elements and class names right for the css to work. For example:

<fieldset>
    <div class="form-row">
        <form method="post" action=".">
            {% csrf_token %}
            {{ form.as_p }}
        <button type="submit" value="submit">Add</button>
    </form>
  </div>
</fieldset>

Then at the BOTTOM of the template (after the markup to render the form), add this script and replace pricetags with whatever your Many to Many (M2M) relationship name is on the model form's model:

<script type="text/javascript">
    addEvent(window, "load", function(e) { SelectFilter.init("id_pricetags", "pricetags", 0, "{{ STATIC_URL }}admin/"); });
</script>

Apparently your media location may be something different, but {{ STATIC_URL }}admin/ worked for me.

like image 67
SuperFunkyMonkey Avatar answered Sep 29 '22 08:09

SuperFunkyMonkey