【问题标题】:Django admin page copy ManyToMany related field from one model to anotherDjango 管理页面将 ManyToMany 相关字段从一个模型复制到另一个模型
【发布时间】:2022-01-04 08:51:40
【问题描述】:

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

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

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。非常感谢任何帮助。

提前致谢。

【问题讨论】:

    标签: python python-3.x django django-admin django-admin-actions


    【解决方案1】:

    我认为有很多方法可以解决这个问题。一种方法是覆盖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 参数会为您提供该实例,而 change 参数将是 True。在您修改现有计划的情况下,您可能希望在添加组成员之前实施一些额外的检查并删除现有成员。

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

    【讨论】:

    • 感谢您的建议。那行得通
    • 一个后续问题。我正在尝试更改“添加”或插入视图并保持“更改”或编辑视图不变。我知道我们可以通过创建add_form_template 并在模板中扩展 admin/change_form.html 来做到这一点。这是最好的方法还是有其他“快速而肮脏”的更简单的方法?提前致谢
    • 这个答案正是我想要的 :) 没关系这个问题。 stackoverflow.com/questions/44877651/…
    猜你喜欢
    • 1970-01-01
    • 2016-06-30
    • 2019-09-04
    • 1970-01-01
    • 2017-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-11
    相关资源
    最近更新 更多