首页 > 解决方案 > django 将 ModelChoiceField 的“to_field_name”设置为多列

问题描述

我想在 Django 的 modelChoiceField 中提供多个字段名称to_field_name

就像是

field1  = forms.ModelChoiceField(queryset=myModel.objects.all(), required=False,
                   empty_label="--------",
                   
                  to_field_name=["col1, col2"],
                 
                  widget=forms.Select(attrs={'class':'form-control'}),
        )

我有一个像

class Codes(models.Model):
     item_code    = models.CharField(max_length=50)
     item_name    = models.CharField(max_length=50)
    
    def __str__(self):
        return self.item_code + self.item_name

现在我可以设置queryset

field1  = forms.ModelChoiceField(queryset=Codes.objects.all(), required=False,
                   empty_label="--------",
                                    
                  widget=forms.Select(attrs={'class':'form-control'}),
        )

我将在我的select标签选项中获得两个字段的组合

一切正常,但是当我打开编辑页面时,选择框不显示默认选择值

另外,我想要一个字段组合,因为item_code在数据库中重复时to_field_name会出错。

标签: djangodjango-modelsdjango-forms

解决方案


我相信你解释to_field_name错了:

根据 Django 网站(Django to_field_name解释):

此可选参数用于指定要用作字段小部件中选项值的字段。确保它是模型的唯一字段,否则所选值可能匹配多个对象。默认情况下它设置为无,在这种情况下,将使用每个对象的主键...

这意味着您可以使用to_field_name来处理 HTML 中的表单对象。但它并没有说明多重to_field_name价值。通常主键用于寻址对象。如果您设置,to_field_name则将使用该字段。

要将数据实际添加到modelChoiceField对象中,您需要执行类似的操作。

class CustomForm(ModelForm):
    muscles = forms.ModelMultipleChoiceField(
                        queryset=None,
                        to_field_name='name',
                        required=False,)

    def __init__(self, *args, **kwargs):
        super(CustomForm, self).__init__(*args, **kwargs)
        self.fields['name'].queryset = Users.objects.all()

推荐阅读