【发布时间】:2017-11-02 16:15:02
【问题描述】:
我正在寻求有关如何解决以下问题的建议:
我有这些模型:Event > EventAttendees > EventRoster。 每个活动都有参加者(用户),我想为该特定活动分配到特定位置(EventRoster 的属性)。
示例:-事件(足球/足球比赛),参加者:(鲍勃,约翰,迈克,史蒂夫),事件名单:(鲍勃 = 守门员,约翰 = 左翼,迈克 = 中锋,史蒂夫 = 防守)
想法是有一个活动表格,参加者中的任何人都可以分配到任何职位。每个表单字段代表一个位置,可以选择参加者,如果该参加者尚未被选为不同的位置。
我的问题是,我从 EventAttendees.objects.all() 或 .filter(event__pk=pk) 中选择与会者,而没有更新此查询集以排除已被选为其他职位的与会者。
如果已在表单字段(位置)中选择了与会者,我的目标是从查询集中排除与会者。基本上,一旦将所有与会者分配到所有位置,查询集就会为空。
解决此问题的最佳方法是什么?我在所谓的链式字段中发现了相似之处,但我想这些在这种情况下并不适用。如果没有 ajax,我可能无法做到这一点,因为除非提交表单,否则表单上的字段值不会改变。
提前感谢您的支持!
class Event(models.Model):
name = models.CharField(max_length=30, blank=True, null=True)
attendees = models.ManyToManyField(User, through='EventAttendees')
class EventAttendees(models.Model):
user = models.ForeignKey(User, related_name='user_event')
event = models.ForeignKey(Event, related_name='ice')
def __str__(self):
return self.user.username
class Meta:
unique_together = ('user','event')
class EventRoster(models.Model):
event = models.ForeignKey(Event, related_name='event_roster')
goalie = models.CharField(max_length=20, blank=True, null=True, unique=True)
center = models.CharField(max_length=20, blank=True, null=True, unique=True)
left_wing = models.CharField(max_length=20, blank=True, null=True, unique=True)
defensemen = models.CharField(max_length=20, blank=True, null=True, unique=True)
class RosterForm(forms.ModelForm):
goalie = forms.ModelChoiceField(queryset=EventAttendees.objects.none())
center = forms.ModelChoiceField(queryset=EventAttendees.objects.none())
left_wing = forms.ModelChoiceField(queryset=EventAttendees.objects.none())
defensemen = forms.ModelChoiceField(queryset=EventAttendees.objects.none())
def __init__(self, *args, **kwargs):
super(RosterForm, self).__init__(*args, **kwargs)
self.fields['goalie'].queryset = EventAttendees.objects.filter(event__pk=50).distinct()
self.fields['center'].queryset = EventAttendees.objects.filter(event__pk=50).distinct()
self.fields['left_wing'].queryset = EventAttendees.objects.filter(event__pk=50).distinct()
self.fields['defensemen'].queryset = EventAttendees.objects.filter(event__pk=50).distinct()
class Meta:
model = EventRoster
fields = ['goalie','center','left_wing','defensemen']
【问题讨论】:
-
您是否尝试在没有页面加载的情况下操作表单中的数据?您需要使用 JavaScript 来执行此操作。
-
在 Django 模型中,为相互依赖的字段编写一个干净的方法。这可以防止提交无效数据。还要写一些javascript来简化用户界面。您的职位是选择字段,但您不必像选项选择那样呈现它们。只需将每个与会者拖放到一个位置上?