【问题标题】:How can I limit the available choices for a foreign key field in a django modelformset?如何限制 django modelformset 中外键字段的可用选择?
【发布时间】:2010-12-16 20:57:43
【问题描述】:

应用: 这是一个会议的研讨会提案系统。用户可以创建演示者和研讨会,并将它们链接在一起。每个用户只能访问她/他创建/拥有的演示者和研讨会。

# Models:

class Workshop(models.Model):
    name = models.CharField(max_length=140, db_index=True)
    presenters = models.ManyToManyField("Presenter", through="WorkshopPresenter")
    owner = models.ForeignKey(User)

class Presenter(models.Model):
    name = models.CharField(max_length=140, db_index=True)
    owner = models.ForeignKey(User)

class WorkshopPresenter(models.Model):
    workshop = models.ForeignKey("Workshop")
    presenter = models.ForeignKey("Presenter")
    cardinality = models.IntegerField()

要将演示者链接到研讨会,用户将被引导至特定于研讨会的页面,其中包含WorkshopPresenter 的模型表单集。工作坊和基数由表单集填写后的视图设置,因此用户只能看到带有可能的演示者姓名的下拉列表。 Image of the association page

问题:如何才能使此关联页面上的演示者下拉列表仅包含当前用户拥有的演示者?下拉列表应该只包含Presenter.objects.filter(owner__exact=request.user) 的结果。目前它们包含所有个演示者。

# View snippet that creates the formset:

workshop = Workshop.objects.filter(owner__exact=request.user).get(id=workshop_id)

MyWorkshopPresenterFormSet = modelformset_factory(WorkshopPresenter, 
                                                  formset=WorkshopPresenterFormSet, 
                                                  extra=5, 
                                                  exclude = ("workshop","cardinality"))
formset = MyWorkshopPresenterFormSet(request.POST or None,
                                     queryset=workshop.workshoppresenter_set.all())

WorkshopPresenterFormSet 只是扩展 BaseModelFormSet 并进行一些自定义验证,没什么特别的。

我已经看到了一些适用于常规表单的解决方案,但不适用于模型表单集。

【问题讨论】:

    标签: django django-models django-forms


    【解决方案1】:

    您可以使用函数式方法(curry)、闭包或回调动态更改表单上的查询集。在“passing custom form parameters to formset”的前三个答案中查看所有三种方法。

    另请参阅 James Bennetts 的帖子“So you want a dynamic form”,以深入讨论闭包方法。

    【讨论】:

    • 我花了一段时间才真正把它弄干净,但 James Bennett 的链接非常好。最终创建了一个 getWorkshopPresenterForm(request.user) 函数,该函数动态定义并返回特定于该用户的表单类。
    猜你喜欢
    • 1970-01-01
    • 2016-08-01
    • 2011-11-14
    • 2012-12-20
    • 2012-08-12
    • 2015-05-08
    • 1970-01-01
    • 2021-12-24
    相关资源
    最近更新 更多