【问题标题】:Django - MultiChoiceField to_field_name and selectedDjango - MultiChoiceField to_field_name 并选中
【发布时间】:2016-10-21 16:41:12
【问题描述】:

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

举个例子:

在模型 2 中,我有这些元素:{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。

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

感谢您的帮助!

【问题讨论】:

  • 我忘了说我使用的是 Django 1.7.11
  • 您想通过使用to_field_name 来实现什么?请展示您的模型。混合使用真实变量名(例如muscles)和虚构名称(例如Model2)会使您的代码更难理解。
  • 我进行了更改。我正在使用to_field_name 更改生成输入的值,因为我希望在这些值中使用 field1 而不是 pk。
  • 当您不将 to_field_name 用于模型字段时,似乎 Django 不支持将 to_field_name 用于表单字段。输入的值对用户不可见,因此不清楚为什么要设置to_field_name
  • 老实说,在 django 需要预先选择存储在数据库中的选定值之前,它运行良好。综上所述,表单域使用to_field_name很好,但是模型没有使用它。并且模型的属性to_field 不起作用

标签: python django forms field


【解决方案1】:

看起来你可能已经点击了this bug,这在 Django 1.10 中已修复。

【讨论】:

  • 谢谢。我现在需要安排我的项目的更新... :p
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2020-12-05
    • 2012-01-01
    • 2016-10-18
    • 1970-01-01
    • 1970-01-01
    • 2017-09-11
    • 2015-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多