在Django管理面板中创建多个对象

dojqjjoe  于 2023-08-08  发布在  Go
关注(0)|答案(1)|浏览(96)

我的愿望是在一个django管理面板创建窗口中创建多个对象。你看:

class ExampleModel(models.Model)
   field1 = models.CharField()
   field2 = models.CharField()
   field3 = models.CharField()
   date = models.DateField()

字符串
在这种情况下,最重要的部分是日期,我经常在管理面板中创建对象,其中前3个字段是相同的(在创建时),只有日期必须是唯一的。所以我想集成一些小部件,我可以选择我需要的所有日期,并通过点击提交按钮创建对象的数量。
我找到了一个名为django-bulk-admin的包,可以解决我的任务。但Django 3不支持。ChatGPT还建议我在Admin类定义中创建一些操作,但它不起作用。我想解决的办法是重新定义这个模型的AdminForm的动作,但是我不知道怎么做?

**更新。**这是我目前正在设计的实际模型(简化版)。管理员使用admin-panel添加课程。想象一下,一些组#1,在1个学期(学期=60天)将有课每周三天。大约有25节课。**每个课程必须是单独的对象。**这25个课程作为对象几乎是相等的,只有日期是唯一的。这就是为什么我尝试一次添加许多对象,选择多个日期。这些对象(课程)在未来将具有关于课程状态的唯一信息和其他附加信息,但在创建时,它们仅在日期上不同。

class Lesson(models.Model):
    study_group = models.ForeignKey(StudyGroup, on_delete=models.CASCADE)
    semester = models.CharField(choices=SEMESTER_CHOICES)
    date = models.DateField()
    status = models.CharField(default='the lesson was not held')
    reason_for_not_held = models.TextField(default = 'lesson not started yet..') #if status is 'the lesson wasn't held'
    substitute_teacher = models.ForeignKey(CustomUser, on_delete=models.SET_NULL, null=True, blank=True) #if status is 'the lesson has been transferred to another teacher'

lnxxn5zx

lnxxn5zx1#

如果相同的值经常出现在相同的列中,并且这不是巧合,就像两个人“碰巧”有相同的名字一样,这被称为 * 数据重复 *,数据重复通常是一件坏事:它使数据库更大,但也使数据更不容易管理:例如,如果您输入了错误的substitute_teacher,则意味着您需要更新该序列的所有课程。
通常,解决方案是创建两个模型,其中第二个模型包含特定于 * 每个示例 * 的数据,而第一个项目的ForeignKey包含通用数据。在这里,这意味着:

class LessonSequence(models.Model):
    study_group = models.ForeignKey(StudyGroup, on_delete=models.CASCADE)
    semester = models.CharField(choices=SEMESTER_CHOICES)
    substitute_teacher = models.ForeignKey(
        CustomUser, on_delete=models.SET_NULL, null=True, blank=True
    )

class Lesson(models.Model):
    lesson_sequence = models.ForeignKey(LessonSequence, on_delete=models.CASCADE)
    date = models.DateField()
    status = models.CharField(default='the lesson was not held')
    reason_for_not_held = models.TextField(
        default='lesson not started yet..'
    )  # if status is 'the lesson wasn't held'

字符串
通常你想批量查看或编辑ModelAdmin中的相关项目,Django管理员可以做到这一点:inlines[Django-doc].事实上,你可以为LessonSequence使用ModelAdmin(如果你想为Lesson模型创建一个,你也可以),另外我们可以在ModelAdmin for LessonSequence中为Lesson s创建**TabularInline[Django-doc]或StackedInline**[Django-doc]:

# app_name/admin.py
from django.contrib import admin

class LessonInline(admin.TabularInline):
    model = Lesson

@admin.register(LessonSequence)
class LessonSequenceAdmin(admin.ModelAdmin):
    inlines = [
        LessonInline,
    ]
    # …

相关问题