Django - MultiChoiceField to_field_name并选中

时间:2016-06-20 12:11:29

标签: python django forms field

我目前正在使用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。

我希望我已经足够清楚。

感谢您的帮助!

2 个答案:

答案 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中修复的。