我有一个非管理员表单,我想在其中使用filter_horizontal。我读过this,它比我想要的更多(我只想要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/']
顺便说一句:我明白这可能与this重复,但他的问题没有得到解答。我做了很多功课here和here,但这些都没有效果。
答案 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 %}