我有一个django项目,我使用nested-admin,我正在试图弄清楚如何将元素的外键设置为祖父母的id。
我有以下model.py
:
class Person(models.Model):
name = models.CharField(max_length=80)
def __str__(self):
return self.name
class Job(models.Model):
location = models.CharField(max_length=20, null=True, blank=True)
person = models.ForeignKey(Person)
class Project(models.Model):
name = models.CharField(max_length=20, null=True, blank=True)
job = models.ForeignKey(Job, null=True)
person = models.ForeignKey(Person)
Project
的FK到Job
可以为NULL,原因很简单,项目不一定与作业(即个人项目)相关。
admin.py
:
class ProjectInline(NestedStackedInline):
model = Project
extra = 1
class JobInline(NestedStackedInline):
model = Job
inlines = [ProjectInline]
extra = 1
@admin.register(Person)
class PersonAdmin(NestedModelAdmin):
model = Person
inlines = [JobInline]
目前,Person
表单如下所示:
我们可以选择Person
中的Project
这一事实没有任何意义。我想直接将它附加到Job
的人身上。
我认为我必须自定义表单或视图,并查看UpdateView
(例如this link),但我无法做我想做的事。
答案 0 :(得分:1)
我设法使用nested_admin源代码工作。
首先,从person
表单中排除project
字段:
class ProjectInline(NestedStackedInline):
# [...]
exclude = ["person"]
在PersonAdmin
中,添加以下代码:
def save_formset(self, request, form, formset, change):
for form in formset.forms:
for job_form in form.nested_formsets:
job_form.instance.person = form.instance.person
for project_form in job_form:
project_form.instance.person = form.instance.person
super(PersonAdmin, self).save_formset(request, form, formset, change)
这样,person
字段就不会显示,阻止用户更改字段,它会自动设置为与Job
相同的值Person
您正在修改。
但是,如果您尝试将ProjectInline
添加到Person
,则会出现另一个问题:
正如您所看到的,项目"网站"显示在Job子集和Person中。
经过大量的工作,你可能会完全按照自己的意愿行事。
但在我看来,最简单的解决方案是创建两个不同的Project
模型,这两个模型都继承自相同的基础。您有一个PersonnalProject
,FK为Person
,JobProject
,FK为Job
。
它将在数据库中占据更多位置,但之后更容易处理。