Django嵌套管理员:如何设置祖父母的外键?

时间:2016-07-26 15:58:41

标签: python python-3.x django-models django-forms

我有一个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表单如下所示:

Current look. See Person field[2]

我们可以选择Person中的Project这一事实没有任何意义。我想直接将它附加到Job的人身上。

我认为我必须自定义表单或视图,并查看UpdateView(例如this link),但我无法做我想做的事。

1 个答案:

答案 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,则会出现另一个问题:

The problem you'll encounter

正如您所看到的,项目"网站"显示在Job子集和Person中。

最佳解决方案

经过大量的工作,你可能会完全按照自己的意愿行事。

但在我看来,最简单的解决方案是创建两个不同的Project模型,这两个模型都继承自相同的基础。您有一个PersonnalProject,FK为PersonJobProject,FK为Job

它将在数据库中占据更多位置,但之后更容易处理。