Django:使用内联一对一字段

时间:2018-02-17 14:16:58

标签: django django-admin

我有3个模型用户,学生和老师。

class User(..):
    username=..
    firstname=..
    more_fields..

class Student(..):
    user = models.OneToOneField(User, ..)
    a = ..
    more_fields....

class Teacher(..):
    user = models.OneToOneField(User, ..)
    b = ..
    more_fields.....

在管理员方面,我希望显示学生和教师模型,以便在添加新学生/教师时填写用户表字段,即添加学生表单用户模型堆叠在它下面。我在使用内联时遇到错误 用户模型没有学生模型的外键

**Add Student form**
a <input_field>
more_student_related_fields
username <input_field>
firstname <input_field>
more_user_related_fields

同样适用于添加教师表单

1 个答案:

答案 0 :(得分:0)

您应该使用inline model admin

admin.py

class StudentInline(admin.StackedInline):
    model = Student

class TeacherInline(admin.StackedInline):
    model = Teacher

class UserAdmin(admin.ModelAdmin):
    inlines = (StudentInline, TeacherInline)

admin.site.register(User, UserAdmin)

修改

要将用户模型分别堆叠在Student和Teacher模型下方,您必须更改结构如下:

models.py中的

class Student(models.Model):
    ...

class Teacher(models.Model):
    ...

class User(models.Model):
    student = models.OneToOneField(Student, on_delete=models.CASCADE, null=True)
    teacher = models.OneToOneField(Teacher, on_delete=models.CASCADE, null=True)
    ...

然后在admin.py

class TeacherUserInline(admin.StackedInline):
    model = User
    exclude = ('student',)


class StudentUserInline(admin.StackedInline):
    model = User
    exclude = ('teacher',)


class TeacherAdmin(admin.ModelAdmin):
    inlines = (TeacherUserInline,)


class StudentAdmin(admin.ModelAdmin):
    inlines = (StudentUserInline,)

admin.site.register(Teacher, TeacherAdmin)
admin.site.register(Student, StudentAdmin)