在Django中Admin之外使用filter_horizo​​ntal最简单的方法

时间:2011-10-15 13:38:54

标签: django django-forms django-templates

我有一个非管理员表单,我想在其中使用filter_horizo​​ntal。我读过this,它比我想要的更多(我只想要filter_horizo​​ntal)。我想查看是否有人想出一种更简单(更新)的方法来实现filter_horizo​​ntal。

所以这是代码:

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/']
顺便说一句:我明白这可能与this重复,但他的问题没有得到解答。我做了很多功课herehere,但这些都没有效果。

2 个答案:

答案 0 :(得分:13)

我知道这个帖子已经过时了,但希望这些信息可以帮助那些偶然发现此页面的人。

经过多次痛苦和痛苦,我能够使用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处(在标记之后渲染表单),添加此脚本并将pricetags替换为模型表单模型上的多对多(M2M)关系名称:

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

显然,您的媒体位置可能有所不同,但{{STATIC_URL}}管理员/为我工作。

答案 1 :(得分:0)

我在2020年的Django 3中非常轻松地完成了此工作;自2011年提出该问题以来,也许情况已经发生了变化。我所需要做的只是设置表单字段的小部件,在类上未定义自定义Media(django将根据使用的小部件自动添加它):

class FooForm(forms.Form):
    linked_bars = forms.ModelMultipleChoiceField(queryset=Bar.objects.all(),
                         widget=widgets.FilteredSelectMultiple(Bar._meta.verbose_name_plural, False))
# end of class, no Media!

您确实需要全局加载jsi18n,所以在基本模板中,我有:

{% block extrahead %}
  {{ block.super }}
  <script type="text/javascript" src="/admin/jsi18n/"></script>
{% endblock %}