如何使用 Django 管理内联表单自动邀请所选组的所有用户?

How to Auto Invite all users of selected Group using Django admin inlines form?

我正在开发一个应用程序,目前我有
1) Staff模型通过OneToOne关系连接到User模型,可以有多个Group.
2) 会议模型也可以分配到多个
3) RSVPinlineMeetingAdmin 的一部分作为内联表格。

在这里,我试图在创建会议时自动添加在 Django 管理表单中的选定组中关联的所有“员工”。

我已尝试 save_model 在会议的“创建者”字段中添加当前用户。

models.py

class Group(models.Model):
    name = models.CharField(max_length=200)

class Staff(models.Model):
    fullname = models.CharField(max_length = 250,verbose_name = "First Name")
    group = models.ManyToManyField(Group, blank=False,verbose_name = "Meeting Group")  # protect error left to add
    is_active = models.BooleanField(default=True)
    user = models.OneToOneField(User, on_delete=models.CASCADE,null=True, blank=True,verbose_name = "Associated as User")  # protect error left to add
    left_date = models.DateField(null=True, blank=True,verbose_name = "Resigned Date")

class Meeting(models.Model):
    title = models.CharField(_('Title'), blank=True, max_length=200)
    start = models.DateTimeField(_('Start'))
    group = models.ManyToManyField(Group, blank=False,verbose_name = "Meeting Group")  # protect error left to add
    location = models.ForeignKey(Location, blank=False,verbose_name = "Location",on_delete=models.CASCADE)  # protect error left to add

class RSVP(models.Model):
    meeting = models.ForeignKey(Meeting, on_delete=models.CASCADE)
    responder =  models.ForeignKey(User, editable=True, on_delete=models.CASCADE, null=True, blank=True,verbose_name = "Attendees", related_name='guest')
    response = models.CharField(max_length = 20, choices= MEETING_RSVP, default='No response', verbose_name = "Status",null=True, blank=True)

admin.py

class RSVPInline(admin.TabularInline):
    model = RSVP
    extra = 0


class MeetingAdmin(admin.ModelAdmin):
    form = MeetingForm
    list_display = ('title', 'location', 'start','creator' )
    inlines = [RSVPInline, TaskInline]

    #Currently using save_model to automatically add current user as a creator
    def save_model(self, request, obj, form, change):
        obj.creator = request.user
        super().save_model(request, obj, form, change)

我的伪代码是:

grouplist = Get group's list from submitted MeetingForm
stafflist = Staff.objects.filter(department__in =grouplist).values_list('id', flat=True).distinct()
Add to RSVPInline:
    values = list(for staff in stafflist:
              'responder' = staff
              'meeting' = 'meeting from  MeetingForm' 
              'response' = has a default value in model

    bulk_create() RSVPInline with values

您可以扩展 save_related() ModelAdmin 方法以 在表单对象 (Meeting) 之后执行其他操作及其内联(RSVPs,如果存在于提交的表单中)被保存:

class MeetingAdmin(admin.ModelAdmin):
    ...

    def save_related(self, request, form, formsets, change):
        # call original method - saves Meeting and inlines
        super(MeetingAdmin, self).save_related(request, form, formsets, change)
        # get this form Meeting
        obj = form.instance
        # get Staff members of this meeting groups
        # and we can exclude ones already having
        # RSVP for this meeting
        stafflist = Staff.objects.filter(
            group__in=obj.group.all()
        ).exclude(
            user__guest__meeting=obj
        )
        rsvps = list(
            RSVP(responder=staff.user, meeting=obj)
            for staff in stafflist
        )
        # calls bulk_create() under the hood
        obj.rsvp_set.add(*rsvps, bulk=False)

** 一些可能有用的注释: