首页 > 解决方案 > Django模型管理中的多个内联

问题描述

我有一些模型如下:

models.py

   from django.db import models
    
    SET_CHOICES = [
            ('A', 'Set A'),
            ('B', 'Set B'),
            ('C', 'Set C'),
            ('D', 'Set D')
        ]
    
    class Exam(models.Model):
        exam_name = models.CharField(max_length=255)
        sub_code =  models.CharField(max_length=10)
        sub_name = models.TextField()
        max_marks = models.PositiveIntegerField()
        def __str__(self):
            return f'{self.sub_code}: {self.sub_name}'
    
    class ExamSet(models.Model):
        which_exam = models.ForeignKey(Exam,on_delete=models.CASCADE)
        set_name = models.CharField(
            max_length=1,
            choices=SET_CHOICES,
            default='A',
        )
    
        def __str__(self):
            return f'{self.which_exam.sub_code}: {self.which_exam.sub_name} (Set {self.set_name})'
    
    class Question(models.Model):
        for_which_exam_set = models.ForeignKey(ExamSet, on_delete=models.CASCADE) 
        question_order = models.PositiveIntegerField(blank=True)
        question_text = models.TextField()
        max_marks = models.PositiveIntegerField()
    
        def __str__(self):
            return f'{self.for_which_exam_set}: {self.question_text}'
    
    
    class Choices(models.Model):
        choice_text = models.TextField()
        is_correct = models.BooleanField()
        for_which_question = models.ForeignKey(Question, on_delete=models.CASCADE)

admin.py

from django.contrib import admin
from django.forms import TextInput, Textarea
from django.db import models
from .models import Exam, ExamSet, Question, Choices

# Register your models here.
class QuestionInline(admin.TabularInline):
    model = Question
    extra = 0
    ordering = ("question_order",)
    formfield_overrides = {
        models.TextField: {'widget': Textarea(attrs={'rows':3, 'cols':50})},
    }
    

class ChoicesInline(admin.TabularInline):
    model = Choices
    extra = 0
    formfield_overrides = {
        models.CharField: {'widget': TextInput(attrs={'size':'20'})},
        models.TextField: {'widget': Textarea(attrs={'rows':2, 'cols':30})},
    }

class QuestionAdmin(admin.ModelAdmin):
    list_display = ('question_text', 'max_marks', )
    inlines = [
        ChoicesInline
    ]
    formfield_overrides = {
        models.TextField: {'widget': Textarea(attrs={'rows':3})},
    }
    
    
class ExamSetAdmin(admin.ModelAdmin):
    inlines = [
    QuestionInline
    ]
    

admin.site.register(ExamSet, ExamSetAdmin)

admin.site.register(Question, QuestionAdmin )
admin.site.register(Exam)

这使模型内联如下: 在此处输入图像描述

但我想要的是对ExamSet. 所以,

如何将选择也保留在问题和问题的内联中以及考试集中的选择中?

我还应该能够通过选择添加问题。

任何帮助都会很有用。

标签: python-3.xdjangoinline-formset

解决方案


根据@minglyu 的评论,我找到了使用 django-nested-admin 的解决方案。以防万一将来有人在寻找此类功能,我已在此处添加了 admin.py。

请确保您已经安装了 django-nested-admin

pip install django-nested-admin

然后,将应用程序添加到已安装的应用程序中,例如

INSTALLED_APPS = [
    ....
    'nested_admin',
    ...
]

最后,在 中admin.py,我为我的Examset管理员更改了如下代码。

from django.contrib import admin
from django.forms import TextInput, Textarea
from django.db import models
from nested_admin import NestedModelAdmin, NestedTabularInline
from .models import Exam, ExamSet, Question, Choices

# Register your models here.

class ChoicesInline(NestedTabularInline):
    model = Choices
    extra = 0
    formfield_overrides = {
        models.CharField: {'widget': TextInput(attrs={'size':'20'})},
        models.TextField: {'widget': Textarea(attrs={'rows':2, 'cols':50})},
    }

class QuestionInline(NestedTabularInline):
    model = Question
    extra = 0
    inlines = [ChoicesInline]
    ordering = ("question_order",)
    formfield_overrides = {
        models.TextField: {'widget': Textarea(attrs={'rows':3, 'cols':50})},
    }

class ExamSetAdmin(NestedModelAdmin):
    inlines = [
    QuestionInline
    ]
    

admin.site.register(ExamSet, ExamSetAdmin)

谢谢!


推荐阅读