2014-11-04 223 views
0

我有一个布尔领域的典范和外键组合两个领域的ModelForm在Django

class ModelA(models.Model): 
    is_anonymous = BooleanField(default=False) 
    page = ForeignKey(ModelB, null=True) 

我想这两个领域在选择字段组合。

它应该有一个选项<option value="anonymous">Anonymous</option>ModelB中的每个对象的选项。

因此,如果一个页面在<select>选定字段is_anonymous应该是假的,如果选择了匿名领域page应该是空,is_anonymous应该是真实的。

我想我必须将查询集ModelB.objects.all()添加到选择列表中

self.fields['field_name'].widget = forms.Select(choices=[(False, "Not anonymous"), (True, "Anonymous"),]) 

但它将结果保存到外地field_name这是错误的。

回答

0

这里没有必要组合字段。您可以将外键字段的empty_value设置为'anonymous',并在clean方法中处理它。

class ModelAForm(forms.ModelForm): 
    page = forms.ModelChoiceField(queryset=ModelB.objects.all(), empty_value="Anonymous") 

    class Meta: 
     model = ModelB 

    def clean(self): 
     if not self.cleaned_data['page']: 
      self.cleaned_data['anonymous'] = True 
+0

这是一个很好的解决方案。问题是我需要另一种选择。选项将是'[“匿名”,“我的用户名”,(模型b对象)'。只有选择匿名,匿名字段才应该是真实的。它可以通过'ModelChoiceField'完成吗? – Jamgreen 2014-11-04 18:18:33