0

我正在尝试编写一个调度应用程序。这里有多个workers,我创建了一个group工人。组用作创建计划的模板。

当我创建一个Schedule对象时,我想输入一个对象并将其从对象Group复制到对象。我不想为对象本身提供 ForeignKey,因为工作人员可能会在一天内改变,而组应该作为模板保持不变。membersGroupScheduleGroup

模型.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)

我知道这可以通过viewshtml 模板轻松完成。但我试图在admin页面下做同样的事情。我有一个表格Schedule并在其中注册admin.py

表格.py

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

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

管理员.py

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

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

提前致谢。

4

1 回答 1

0

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

@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 会为您提供该实例,而changearg 将是True. 在修改现有计划的情况下,您可能希望在添加组成员之前实施一些额外的检查并删除现有成员。

可以在django 文档中找到有关管理站点、现有方法以及您可以做什么的更多详细信息。

于 2022-01-04T10:12:34.370 回答