我目前正在使用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。
作为一个例子:
在model2中,我有以下元素:{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。
我希望我已经足够清楚。
感谢您的帮助!
答案 0 :(得分:0)
好吧,我设法实现了我想要的。正如@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
答案 1 :(得分:0)
看起来好像你可能已经点击了this bug,这是在Django 1.10中修复的。