【问题标题】:How to show objects in the form field (Multiple Select Field) based on a condition in django form.如何根据 django 表单中的条件在表单字段(多选字段)中显示对象。
【发布时间】:2018-04-15 13:20:38
【问题描述】:

我有一个多对多字段与我的模型 1 相关联。现在,我为此模型创建了一个表单,并将这个多对多字段添加为表单字段,并使用 FilteredSelectMultiple 小部件对其进行编辑。现在,问题是相关的多对多字段有一个软删除选项,我正在使用模型 2 中的活动字段进行跟踪。所以,现在在表单中显示所有对象,即使它们被删除,有什么方法可以在这个表单字段中显示活动为 true 的对象。

我的模型形式如下:

 class Editform(form.ModelForm):
    class Media:
       css = .. 
       js = ..
    class Meta:
        Model = model1
        fields = [ "x", "y", "ManytoManyfield"]
        widgets = {
            'ManytoManyfield': FilteredSelectMultiple("Displaay name", False)
                   }

【问题讨论】:

    标签: django django-forms


    【解决方案1】:

    This answer 接近你想要的。我认为这可能有效。

    您在 ModelForm 中创建一个额外的字段,并使用查询填充它。

    class Editform(form.ModelForm):
        many_to_many_field_active = forms.ChoiceField(choices=[(m2m.id, m2m.name) for m2m in Model2.objects.filter(active=True)])
    
        class Meta:
            #...
            widgets = {
            'many_to_many_field_active': Select(attrs={'class': 'select'}),
    

    【讨论】:

    • 这在表单中只显示了一个单选选择字段,我想过滤多选(就像在 django admin 中一样)。
    【解决方案2】:

    我使用模型表单中的多项选择域解决了这个问题,如下所示。

     def __init__(self, *args, **kwargs):
       many_to_m_initial = kwargs['instance'].model2.all()
       choices = [(m2m.id, m2m.name) for m2m in Model2.objects.filter(active=True)]
       self.fields['my_field'] = forms.MultipleChoiceField(choices = choices, widget=FilteredSelectMultiple("verbose name", is_stacked=False, choices=choices))
       self.initial['my_field'] = [ m2m.pk fpr m2m in many_to_m_initial ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-01
      • 2020-04-18
      • 1970-01-01
      • 2012-04-26
      相关资源
      最近更新 更多