繁体   English   中英

Django-如何从表单的查询集中排除已选择的对象?

[英]Django - How to exclude already selected object from queryset in form?

我正在寻求有关如何解决以下问题的建议:

我有以下模型: Event > EventAttendees > EventRoster 每个事件都有参与者(用户),我希望将其分配给该特定事件的特定职位(EventRoster的属性)。

例如:-Event(足球/足球比赛),与会者:(鲍勃,约翰,迈克,史蒂夫),事件发球者:(鲍勃=守门员,约翰=左翼,迈克=中锋,史蒂夫=防守)

想法是要有一个活动表格,与会者中的任何人都可以分配到任何职位。 每个表单字段将代表一个职位, 如果尚未为其他职位选择该与会者可以选择该与会者

我的问题是,我从EventAttendees.objects.all()或.filter(event__pk = pk)中选择参与者,而没有更新此查询集以排除已经为其他职位选择的参与者。

我的目标是,如果已在表单字段(位置)中选择该与会者,则将该与会者从queryset中排除。 一旦所有与会者都分配到所有职位,基本上就将具有空的查询集。

解决此问题的最佳方法是什么? 我在所谓的链接字段中发现了相似之处,但是我想这些不适用于这种情况。 如果没有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']

我不能真正理解逻辑,除非我看到整个代码,即视图和表单,但是我认为在查询模型时, exclude()函数会派上用场

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM