【问题标题】:Django - How to exclude already selected object from queryset in form?Django - 如何从表单中的查询集中排除已选择的对象?
【发布时间】: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来简化用户界面。您的职位是选择字段,但您不必像选项选择那样呈现它们。只需将每个与会者拖放到一个位置上?

标签: python django forms


【解决方案1】:

除了我看到整个代码(即视图和表单)之外,我真的无法理解逻辑,但我认为exclude() 函数在查询模型时会派上用场

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-03
    • 2013-01-27
    • 2016-08-09
    相关资源
    最近更新 更多