通过覆盖 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 CheckboxSelectMultiple 覆盖 ModelForm 中的“选择”
覆盖 ModelForm.save 不会更新所有受影响的字段
使用覆盖保存为抽象模型扩展 Django ModelForm
如何在不覆盖 ModelForm 中的字段定义的情况下将 ManyToManyField 小部件更改为 CheckboxSelectMultiple