通过重写ModelForm和ModelChoiceField来连接两个模型的值

时间:2012-06-07 09:06:49

标签: django forms django-models admin modelform

为了在Django AdminForm中仅显示ForeignKey Selectbox中的相关项目,我使用ActionAdminForm类自定义了ActionAdmin模型。预选值我使用了像https://stackoverflow.com/a/9191583/326905这样的类。非常感谢,这非常好。

但是当用户没有导航表格时客户 - >项目 - >动作并直接导航到django admin中的Actions我想在ActionAdmin表单中的foreignkey项目的selectbox中显示值,格式如下:

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

我的问题是,如何覆盖self.fields [“project”]
在下面的代码中的else情况下,为了使我从select.customer.name和Project.name连接selectbox值?

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

1 个答案:

答案 0 :(得分: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)