如何根据django形式中的条件在表单域(多选字段)中显示对象。

时间:2017-11-02 21:43:55

标签: django django-forms

我有一个与我的model1链接的多对多字段。现在,我为此model1创建了一个表单,并将此多个字段添加到表单字段中,并使用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)
                   }

2 个答案:

答案 0 :(得分:0)

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'}),

答案 1 :(得分:0)

我使用模型表格中的multiplechoicefield解决了这个问题,如下所示。

 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 ]