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

为了在 Django AdminForm 的 ForeignKey 选择框中仅显示相关的项目,我使用 ActionAdminForm 类自定义了我的 ActionAdmin 模型。为了预选值,我使用了类似此处发布的类https://stackoverflow.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给我发力了。
  • 您应该发布您的答案并将其标记为已接受,这将使遇到相同问题的用户更容易:)
  • 我刚刚将我的答案移至单独的答案

标签: django forms django-models admin modelform


【解决方案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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-07
    • 2011-02-28
    • 1970-01-01
    • 2019-10-04
    • 2019-08-15
    • 1970-01-01
    • 1970-01-01
    • 2014-11-09
    相关资源
    最近更新 更多