Самый простой способ использовать filter_horizontal вне Admin в Django

У меня есть форма, отличная от admin, в которой я бы хотел использовать filter_horizontal. Я прочитал этот, который делает гораздо больше, чем я хочу (я хочу только filter_horizontal). Я хотел проверить, есть ли у кого-нибудь более простой (более современный) способ просто реализовать filter_horizontal.

Итак, вот код:

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)

Тогда наша форма выглядит так. Я думал, что это сработает.

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/']

Кстати: я понимаю, что это может быть дубликат этого, но на его вопрос не ответил. Я сделал много домашних заданий здесь и здесь но ни одна из них не работает.

Ответ 1

Я знаю, что эта ветка устарела, но, надеюсь, эта информация поможет кому-то, кто наткнулся на эту страницу, как я.

После большой боли и страданий я смог заставить это работать с Django 1.4. Как rh0dium, я пробовал все эти статьи, но должен был сделать много настроек.

Вам не нужно ничего делать с ModelForm, но вам нужно включить все эти js и css файлы в шаблон:

<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"/>

Затем визуализируйте форму, как обычно, но вам нужно получить элементы набора полей и имена классов для работы css. Например:

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

Затем в BOTTOM шаблона (после разметки для визуализации формы) добавьте этот script и замените pricetags на то, что ваше имя отношения Many to Many (M2M) находится в модели модели модели:

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

По-видимому, ваше местоположение в медиа может быть чем-то другим, но {{STATIC_URL}} admin/работал у меня.