【发布时间】:2014-05-27 03:03:50
【问题描述】:
我有一个具有 ManyToMany 关系的类,我想用它来为应用创建控制面板:
class ControlPanel(models.Model):
viewtype = models.CharField("view type", max_length=32, unique=True)
choice1 = models.ManyToManyField(Choice1, null=True)
choice2 = models.ManyToManyField(Choice2, null=True)
choice3 = models.ManyToManyField(Choice3, null=True)
其中Choice1、Choice2 和Choice3 是我想呈现为复选框的选项。 controlpanel_choice1、controlpanel_choice2 和 controlpanel_choice3 是带有 Choice1、Choice2 和 Choice3 选项选项的 M2M 关系表。因此,根据视图类型 ID,对于每个 Choice* 集,选择集可能不同(甚至不存在)。
我从这个 ControlPanel 类创建了一个表单来生成我的控制面板:
class ControlPanelForm(ModelForm):
viewtype = forms.ChoiceField(choices = ControlPanel.objects.values_list('id','view'))
choice1 = forms.ModelMultipleChoiceField(widget=forms.CheckboxSelectMultiple, queryset=Choice1.objects.all())
choice2 = forms.ModelMultipleChoiceField(widget=forms.CheckboxSelectMultiple, queryset=Choice2.objects.all())
choice3 = forms.ModelMultipleChoiceField(widget=forms.CheckboxSelectMultiple, queryset=Choice3.objects.all())
class Meta:
model = ControlPanel
这会很好地显示 3 选择* 字段。但是,它并不限制对每个视图类型选项的选择,因为我的查询集为每个 choice* 字段显示 .objects.all()。此外,这会显示对象地址,而不是每个 Choice* 的名称字段。
我怎样才能做到这一点?我需要为绑定和未绑定表单显示 Choice*。我是否需要在构造函数中构建它们,检查我的表单是否有效并获取当前选择的视图类型来构建我的查询集?我可以在我的ControlPanel 类中有这个逻辑,并避免在我的视图函数中编程吗?我会很感激一些例子来做到这一点。
提前致谢。
【问题讨论】:
标签: django many-to-many django-queryset