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

问题描述 投票:0回答:1

我正在开发目前有1)Staff模型通过OneToOne关系连接到用户模型,并且可以具有多个Group。2)Meeting模型也可以分配给许多Group。3)RSVPinline是使用MeetingAdmin作为内联表单的部分。

在这里,我试图在创建会议时以django admin形式自动添加与选定组相关的所有'Staff'。

我已经尝试过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
django forms django-admin admin inlines
1个回答
0
投票

您可以将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)

**可能有用的注释:

© www.soinside.com 2019 - 2024. All rights reserved.