【问题标题】:Django choice field populated by queryset - save id but show value由查询集填充的 Django 选择字段 - 保存 id 但显示值
【发布时间】:2015-12-01 07:41:54
【问题描述】:

我有两个模型,TagTagGroup

class TagGroup(models.Model):
    tag_group_name = models.CharField(max_length=100)

class Tag(models.Model):
    tag_name = models.CharField(max_length=100)
    tag_group = models.ForeignKey(TagGroup, blank=True, null=True)

我已将TagGroup 表单作为选择字段放入模板中,以便我可以将TagGroup 分配给标签。我创建了这个表单来填充 TagGroup 查询集。

class TagGroupForm(ModelForm):
    tag_group_name = forms.ModelChoiceField(queryset=TagGroup.objects.values_list('id', 'tag_group_name'), required=False)

    class Meta:
        model = TagGroup
        fields = [
            'tag_group_name'
        ]

我还没有看到任何明显的说明如何将 Id 分配给 Tag 表,同时仅在模板的选择字段中向用户显示 Tag 值。

目前以上显示:

几个问题:

  1. 查询集是否正确?我试过不使用“values_list”,但它只是在模板的表单字段中显示一个“对象”?

  2. 如何“隐藏” ID 以便我可以保存它,同时只在表单字段中向用户显示实际的字符串值?


已编辑以添加更新的表单:

class TagGroupForm(ModelForm):
    tag_group_name = forms.ModelChoiceField(queryset=TagGroup.objects.all(), to_field_name = 'tag_group_name', required=False)

    class Meta:
        model = TagGroup
        fields = [
            'tag_group_name'
        ]

这现在产生以下 .. 看起来很接近 .. 表单值有一个不错的字符串,但显示给用户的实际值仍然是“TagGroup 对象”。如何让这个显示出来?

【问题讨论】:

    标签: django django-models django-forms django-templates


    【解决方案1】:

    来自the docs

    将调用模型的 str(Python 2 上的 unicode)方法来生成对象的字符串表示以供使用

    所以只需将其分配给对象名称,一切都会好起来的! (另外,你不需要使用values_list)它默认显示Object的原因是因为这是默认的字符串表示。

    class TagGroup(models.Model):
        tag_group_name = models.CharField(max_length=100)
    
        def __str__(self):
            return self.tag_group_name
    
    tag_group_name = forms.ModelChoiceField(queryset=TagGroup.objects.all(), required=False)
    

    或者,如果您不想修改它并希望将其保留用于其他用途。

    要提供自定义表示,子类 ModelChoiceField 并覆盖 label_from_instance。此方法将接收模型对象,并应返回适合表示它的字符串

    class TagChoiceField(ModelChoiceField):
         queryset = TagGroup.objects.all()
         def label_from_instance(self, obj):
             return obj.tag_group_name  # or similar
    

    【讨论】:

    • 我可以买它能够将 id 与所选对象相关联,所以我不需要明确让查询集包含 id。但是,如果我没有明确告诉它使用哪个字段作为向用户显示的值,它会在表单字段中提供“TagGroup 对象”作为选择。如果我确实告诉它使用哪个字段,例如 values_list('tag_group_name'),那么它会显示字符串,但编码如我上面的屏幕截图所示。
    • @genoki - 我不确定您是否看过我的初始答案或完全修改过的答案,但它选择显示的文本基于模型的字符串表示,然后您可以如果您愿意,可以选择使用to_field_name 提供不同的,但由于您要求仍然使用 id 作为值,您只需要设置正确的显示文本
    • 谢谢。我也尝试了to_field_name,它没有返回预期的结果。我用结果更新了我的问题。顺便说一句,模型的字符串表示是什么意思?
    • @genoki - 我已经更新了我的第一个示例,我很确定这就是你想要的
    • 好的,我现在知道了。 模型的字符串表示是指 TagGroup def __str__(self): 定义为调用此模型时要返回的字符串。我之前没有定义过。您提供的子类是硬编码模型字符串以返回的替代方法。因此,必须做这些事情之一才能使查询集选择字段起作用。
    猜你喜欢
    • 1970-01-01
    • 2011-09-17
    • 2023-03-04
    • 2017-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多