通过覆盖 ModelForm 和 ModelChoiceField 连接两个模型的值

Posted

技术标签:

【中文标题】通过覆盖 ModelForm 和 ModelChoiceField 连接两个模型的值【英文标题】:Concatenate value of two models by overriding ModelForm and ModelChoiceField 【发布时间】:2012-06-11 07:56:25 【问题描述】:

为了在 Django AdminForm 的 ForeignKey 选择框中仅显示相关的项目,我使用 ActionAdminForm 类自定义了我的 ActionAdmin 模型。为了预选值,我使用了类似此处发布的类https://***.com/a/9191583/326905。非常感谢,这真的很好。

但是当用户不导航表单客户 -> 项目 -> 操作并直接导航到 django admin 中的操作时,我想在 ActionAdmin 表单中显示外键项目的选择框中的值,格式如下:

客户名称 1 - 项目名称 1 客户名称 1 - 项目名称 2 客户名称 2 - 项目名称 3

我的问题是,我如何覆盖 self.fields["project"] 在下面代码中的 else 情况下,以便我获得从 Project.customer.name 和 Project.name 连接的选择框值?

class ActionAdminForm(ModelForm):
    def __init__(self, *args, **kwargs):
        self.request = kwargs.pop('request', None)
        super(ActionAdminForm, self).__init__(*args, **kwargs)
        if self.request.GET.get('project'):
            prj = Project.objects.get(id=self.request.GET.get('project'))
            self.fields["project"].queryset = Project.objects.filter(customer = prj.customer)
        else:


           self.fields["project"] = ProjectModelChoiceField(Project.objects.all().order_by('name'))

    class Meta:
        model = Action

【问题讨论】:

我自己解决了。覆盖 ModelChoiceField 是线索。 干得好,为自己解决问题 +1。我完全忘记了ModelChoiceField.label_from_instance 谢谢。 python越来越多了,django给我发力了。 您应该发布您的答案并将其标记为已接受,这将使遇到相同问题的用户更容易:) 我刚刚将我的答案移至单独的答案 【参考方案1】:

我得到了解决方案。是的。首先,当我尝试仅使用 self.fields [“project”] 时总是出错,但现在它可以工作了。我将它放入 else 并写了一个如下所示的 ProjectModelChoiceField,受此描述的影响:http://bradmontgomery.blogspot.de/2009/01/custom-form-for-djangos-automatic-admin.html

class ProjectModelChoiceField(ModelChoiceField):
    def label_from_instance(self, obj):
        return "%s - %s"%(obj.customer.name, obj.name)

【讨论】:

以上是关于通过覆盖 ModelForm 和 ModelChoiceField 连接两个模型的值的主要内容,如果未能解决你的问题,请参考以下文章

Django ModelForm 覆盖 __init__

Django CheckboxSelectMultiple 覆盖 ModelForm 中的“选择”

覆盖 ModelForm.save 不会更新所有受影响的字段

使用覆盖保存为抽象模型扩展 Django ModelForm

如何在不覆盖 ModelForm 中的字段定义的情况下将 ManyToManyField 小部件更改为 CheckboxSelectMultiple

不使用modelform的django模型验证