【问题标题】:Django Forms - change the render multiple select widgetDjango Forms - 更改渲染多选小部件
【发布时间】:2010-05-17 10:35:52
【问题描述】:

在我的模型中,我有一个多对多字段

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

在我的表单中,我想将其呈现为:

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

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

  3. 然后在该 ul 列表下 每个选定的 MentorArea 对象与 旁边的 x 再次调用 a javascript函数将 从 对象。

我知道要更改字段元素的呈现方式,您需要创建一个自定义小部件并覆盖呈现函数,而我已经这样做以创建添加按钮。

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)

但这会显示所有导师,无论是否已添加。

谢谢

【问题讨论】:

    标签: django django-forms django-widget


    【解决方案1】:

    对我来说,您描述的功能听起来很像使用 ModelAdmin 的 filter_horizontalfilter_vertical 设置可以实现的功能。 他们渲染的小部件位于django.contrib.admin.widgets.FilteredSelectMultiple。你应该看看它的代码!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-27
      • 2017-10-09
      • 2016-01-28
      • 1970-01-01
      • 2012-08-06
      • 2012-08-24
      • 1970-01-01
      • 2019-01-21
      相关资源
      最近更新 更多