python-3.x - 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
. 所以,
如何将选择也保留在问题和问题的内联中以及考试集中的选择中?
我还应该能够通过选择添加问题。
任何帮助都会很有用。
解决方案
根据@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)
谢谢!
推荐阅读
- python - 允许保留关键字作为 CPython 中的方法
- python - 如何在屏幕上找到具有透明背景的图像?
- php - 在 wordpress 中自定义 comment_form() 和 comments.php
- c++ - 使用 Rcpp 将 R 函数存储在 C++ 中的类对象中
- design-patterns - 从抽象返回具体结果的软件模式
- ios - 你如何管理 iOS 小部件后台请求?
- ocaml - 在 Ocaml 中调用嵌套对象中的方法的语法
- node.js - 什么是“npm run dev”和“npm run prod”
- java - 对于参数类型 int、Distance 和更多错误,运算符 <= 未定义
- python - 启动 tkinter 应用程序时,有没有办法将资产加载为空闲任务?