Django 管理页面将 ManyToMany 相关字段从一个模型复制到另一个模型
Django admin page copy ManyToMany related field from one model to another
我正在尝试编写一个日程安排应用程序。这里有多个 workers
,我创建了 group
个工人。该组用作创建时间表的模板。
当我创建一个 Schedule
对象时,我想输入一个 Group
对象并将 members
从 Group
对象复制到 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。
我正在尝试编写一个日程安排应用程序。这里有多个 workers
,我创建了 group
个工人。该组用作创建时间表的模板。
当我创建一个 Schedule
对象时,我想输入一个 Group
对象并将 members
从 Group
对象复制到 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。