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 中已修复。