Django MultiChoiceField to_field_name和selected

2024-10-02 12:24:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在使用一个多选择域来表示我的领域中相应的ManyToManyField。它工作得很好。在

我更新了我的表单,在表单域中使用属性to_field_name来更改用于输入值的字段,它也可以正常工作。在

我的问题是Django选择表单字段的所选数据时,使用的是pk,而不是tou 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()

模型的字段是一个标准的多个字段。在

例如:

在model2中,我有以下元素:{pk=1,name=name1,field1=3},{pk=2,name=name2,field1=1},{pk=3,name=name3,field1=2}。在

生成的select是:

^{pr2}$

如果我选择name2,正确的pk(即2)将保存在数据库中。 显示表单时,所选选项为name3(即值2),而不是name1。在

我希望我已经足够清楚了。在

谢谢你的帮助!在


Tags: tonameselftrue表单fieldmodelmodels
2条回答

看起来您可能已经点击了this bug,这在django1.10中已修复。在

嗯,我成功地实现了我想要的。正如@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

相关问题 更多 >

    热门问题