Django - MultiChoiceField to_field_name 并选中
Django - MultiChoiceField to_field_name and selected
我目前正在使用 MultiChoiceField 来表示我的字段对应的 ManyToManyField。它工作正常。
我更新了我的表单以使用表单字段中的属性 to_field_name 来更改用于输入值的字段,它也工作正常。
我的问题是 Django 选择表单字段的 selected 数据时使用的是 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。
举个例子:
在 model2 中,我有这些元素:{pk=1, name=name1, field1=3}, {pk=2, name=name2, field1=1}, {pk=3, name=name3, field1=2}.
生成的select是:
<option value=3>name1</option>
<option value=1>name2</option>
<option value=2>name3</option>
如果我selectname2,正确的pk(即2)保存在数据库中。
显示窗体时,selected选项是name3(即值2)而不是name1。
希望我说得够清楚了。
感谢您的帮助!
好吧,我设法实现了我想要的。正如@Alasdair 所建议的,我创建了一个中介模型。
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 Model1Model2(models.Model):
model1 = models.ForeignKey(Model1)
model2 = models.ForeignKey(Model2)
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()
然后在 save_model 方法中,我可以遍历我的字段的值并保存它们。
解决我的问题的重点显然是中介模式。
感谢@Alasdair
看起来你可能命中了 this bug,这在 Django 1.10 中已修复。
我目前正在使用 MultiChoiceField 来表示我的字段对应的 ManyToManyField。它工作正常。
我更新了我的表单以使用表单字段中的属性 to_field_name 来更改用于输入值的字段,它也工作正常。
我的问题是 Django 选择表单字段的 selected 数据时使用的是 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。
举个例子:
在 model2 中,我有这些元素:{pk=1, name=name1, field1=3}, {pk=2, name=name2, field1=1}, {pk=3, name=name3, field1=2}.
生成的select是:
<option value=3>name1</option>
<option value=1>name2</option>
<option value=2>name3</option>
如果我selectname2,正确的pk(即2)保存在数据库中。 显示窗体时,selected选项是name3(即值2)而不是name1。
希望我说得够清楚了。
感谢您的帮助!
好吧,我设法实现了我想要的。正如@Alasdair 所建议的,我创建了一个中介模型。
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 Model1Model2(models.Model):
model1 = models.ForeignKey(Model1)
model2 = models.ForeignKey(Model2)
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()
然后在 save_model 方法中,我可以遍历我的字段的值并保存它们。
解决我的问题的重点显然是中介模式。
感谢@Alasdair
看起来你可能命中了 this bug,这在 Django 1.10 中已修复。