Django Forms - 更改渲染多选小部件

时间:2010-05-17 10:35:53

标签: django django-forms django-widget

在我的模型中,我有一个很多领域

mentors = models.ManyToManyField(MentorArea, verbose_name='Areas', blank=True)

在我的表单中,我想将其渲染为:

  1. 包含所有列表的下拉框 没有的MentorArea对象 与该对象相关联。

  2. 旁边有一个添加按钮 将调用javascript函数 这将把它添加到对象。

  3. 然后在那个ul列表中有 每个选中的MentorArea对象都带有 旁边的x再次调用a javascript函数会 从中移除MentorArea 对象

  4. 我知道要更改字段元素的呈现方式,您需要创建一个自定义窗口小部件并覆盖渲染功能,我已经这样做了以创建添加按钮。

    class AreaWidget(widgets.Select):
    
        def render(self, name, value, attrs=None, choices=()):
            jquery = u'''
            <input class="button def" type="button" value="Add" id="Add Area" />'''
    
            output = super(AreaWidget, self).render(name, value, attrs, choices)
    
            return output + mark_safe(jquery) 
    

    但是我不知道如何列出当前选中的列表。谁能帮我?还有什么是筛选列表的最佳方法,以便它只显示尚未添加的MentorArea对象?我目前的领域是

    mentors = forms.ModelMultipleChoiceField(queryset=MentorArea.objects.all(), widget = AreaWidget, required=False)
    

    但这显示了所有导师,无论他们是否被添加。

    由于

1 个答案:

答案 0 :(得分:1)

对我而言,您所描述的功能与使用ModelAdmin“filter_horizontalfilter_vertical设置可以实现的功能非常相似。 它们呈现的小部件位于django.contrib.admin.widgets.FilteredSelectMultiple。你应该看看它的代码!