Django 管理页面将 ManyToMany 相关字段从一个模型复制到另一个模型

Django admin page copy ManyToMany related field from one model to another

我正在尝试编写一个日程安排应用程序。这里有多个 workers,我创建了 group 个工人。该组用作创建时间表的模板。

当我创建一个 Schedule 对象时,我想输入一个 Group 对象并将 membersGroup 对象复制到 Schedule 目的。我不想给 Group 对象本身一个外键,因为工作人员可能会在一天内发生变化,而组应该作为模板保持原样。

models.py

class Worker(models.Model):
    name = models.CharField(max_length=30)
    email = models.EmailField()

class Group(models.Model):
    name = models.CharField(max_length=30)
    members = models.ManyToManyField(Worker, blank=True)

class Schedule(models.Model):
    start_time = models.DateTimeField()
    end_time = models.DateTimeField()
    date = models.DateField()
    members = models.ManyToManyField(Worker, blank=True)

我知道这可以使用 views 和 html 模板轻松完成。但我正试图在 admin 页面下做同样的事情。我有 Schedule 的表格并在 admin.py

中注册了它

forms.py

class CreateScheduleForm(forms.ModelForm):
    group = ModelChoiceField(queryset=Group.objects.all())

    class Meta:
        model = Schedule
        fields = ( 'date', 'start_time', 'end_time')

admin.py

@admin.register(Schedule)
class ScheduleAdmin(admin.ModelAdmin):
    form = CreateScheduleForm

我不太明白如何接收此输入并处理 Group 对象实例并复制 members。非常感谢任何帮助。

提前致谢。

我认为有很多方法可以解决这个问题。一种方法可能是覆盖 ScheduleAdmin:

中的 save_model 方法
@admin.register(Schedule)
class ScheduleAdmin(admin.ModelAdmin):
    form = CreateScheduleForm

    def save_model(self, request, obj, form, change):
        
        sched = form.save()
        group = form.data.get('group')
        for worker in Group.objects.get(pk=group).members.all():
            sched.members.add(worker)

请注意,这只是一个非常快速和肮脏的示例,每次保存对象时都会添加所选组中的成员。如果您修改现有计划,方法中的 obj arg 会为您提供该实例,而 change arg 将为 True。在修改现有计划的情况下,您可能希望在添加组成员之前执行一些额外的检查并删除现有成员。

有关管理站点、现有方法和您可以做什么的更多详细信息,请参见 django docs