Как автоматически пригласить всех пользователей выбранной группы, используя встроенную форму администратора Django? - PullRequest
0 голосов
/ 08 февраля 2020

Я работаю над приложением, где в настоящее время у меня есть 1) Staff Модель подключена к пользовательской модели через отношения OneToOne и может иметь более одной группы . 2) Встреча модель также может быть назначена для многих Группа . 3) RSVPinline является деталью с MeetingAdmin в качестве встроенной формы.

Здесь я пытался автоматически ДОБАВИТЬ всех ' Персонал ', связанных с выбранными группами, в django форму администратора при создании Встреч.

Я пытался save_model для добавления текущего пользователя в поле creator собрания.

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

1 Ответ

1 голос
/ 12 февраля 2020

Вы можете расширить save_related () Метод ModelAdmin до выполнять дополнительные действия после объекта формы ( Встреча ) и его Inlines ( 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)

** Несколько возможных полезных примечаний:

  • group поле может быть лучше вызывается groups, поскольку оно представляет отношение ManyToMany и возвращает несколько объектов
  • related_name представляет отношение от связанного объекта обратно к этому , поэтому может быть более логично использовать что-то вроде invites вместо guest
...