【发布时间】:2016-10-21 16:41:12
【问题描述】:
我目前正在使用 MultiChoiceField 来表示我的字段对应的 ManyToManyField。它工作正常。
我更新了我的表单以使用表单字段中的属性 to_field_name 来更改用于输入值的字段,它也可以正常工作。
我的问题是 Django 在选择表单字段的选定数据时使用的是 pk 而不是 to_field_name 中给出的字段。有什么线索吗?
class Model1(models.Model):
name = models.Charfield(...)
muscles = models.ManyToManyField(Model2, blank=True, null=True,)
class Model2(models.Model):
name = models.CharField(...)
field1 = models.CharField(...)
class MyForm(ModelForm):
muscles = forms.ModelMultipleChoiceField(
queryset=None,
to_field_name="field1", required=False,)
def __init__(self, *args, **kwargs):
super(MyForm, self).__init__(*args, **kwargs)
self.fields['muscles'].queryset = Model2.objects.all()
模型的字段是标准的ManyToManyField。
举个例子:
在模型 2 中,我有这些元素:{pk=1, name=name1, field1=3}, {pk=2, name=name2, field1=1}, {pk=3, name=name3, field1= 2}。
生成的选择是:
<option value=3>name1</option>
<option value=1>name2</option>
<option value=2>name3</option>
如果我选择name2,则正确的pk(即2)保存在数据库中。 显示表单时,选择的选项是name3(即值2)而不是name1。
我希望我已经足够清楚了。
感谢您的帮助!
【问题讨论】:
-
我忘了说我使用的是 Django 1.7.11
-
您想通过使用
to_field_name来实现什么?请展示您的模型。混合使用真实变量名(例如muscles)和虚构名称(例如Model2)会使您的代码更难理解。 -
我进行了更改。我正在使用
to_field_name更改生成输入的值,因为我希望在这些值中使用 field1 而不是 pk。 -
当您不将
to_field_name用于模型字段时,似乎 Django 不支持将to_field_name用于表单字段。输入的值对用户不可见,因此不清楚为什么要设置to_field_name。 -
老实说,在 django 需要预先选择存储在数据库中的选定值之前,它运行良好。综上所述,表单域使用
to_field_name很好,但是模型没有使用它。并且模型的属性to_field不起作用