我正在使用这样的模型开发一个 RSVP 应用程序:
class Guest(models.Model):
profile = models.ForeignKey(UserProfile)
...
invite_list = models.ManyToManyField(GuestList, through='RSVP')
class RSVP(models.Model):
guestlist = models.ForeignKey(GuestList)
guest = models.ForeignKey(Guest, related_name='rsvp')
...
我正在尝试创建一个多选字段表单,允许用户选择要添加到的客人RSVP
。我正在使用 jQuery 将多项选择增强为 2 个框,其中选定的项目将出现在右侧的框中。
在 forms.py 中并使用crispy_forms
:
class RSVPSelectGuestForm(forms.Form):
guests = forms.MultipleChoiceField()
def __init__(self, *args, **kwargs):
profile = kwargs.pop('profile', None)
guestlist_pk = kwargs.pop('guestlist_pk', None)
super(RSVPSelectGuestForm, self).__init__(*args, **kwargs)
self.helper = FormHelper()
self.helper.layout = Layout(
Field('guests',
id='guests-multiple-select',
),
FormActions(
Submit('submit', 'Save'),
),
)
self.fields['guests'].choices = [(obj.id, str(obj)) for obj in Guest.objects.filter(profile=profile)]
self.fields['guests'].initial = [(obj.guest_id) for obj in RSVP.objects.filter(guestlist_id=guestlist_pk)]
我能够使用上面的代码正确呈现选择多个元素。我将 kwargs 从视图传递到表单get_form_kwargs
。
现在的问题是一种有效地从 RSVP 表中添加/删除客人的方法。我犹豫要不要继续,因为我无法在下面提出的解决方案之间做出决定:
每次在 UI 中发生事件时处理表单- 当用户选择来宾时,它会立即添加到表格中;当用户取消选择用户时,来宾将从 RSVP 表中删除。如果来宾数量增加,这可能会导致大量 SQL 读/写。
在提交表单之前不会保存任何内容- 从发布数据中,我将创建一个包含所选选项的字典,将其与加载表单时的状态进行比较,添加任何新行并从表中删除缺失的行。这只需要 2 个 SQL 操作。
任何人都可以帮助提出一个好的解决方法或更好的想法来解决这个问题吗?我的建议中是否有任何我可能忽略的问题?