我正在开发目前有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
您可以将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)
**可能有用的注释:
group
字段最好表示为groups
,因为它表示ManyToMany关系并返回多个对象related_name
代表relation from the related object back to this one,因此使用类似invites
的东西代替guest
]可能更合乎逻辑。