如何限制django modelformset中外键字段的可用选项?

时间:2009-11-15 21:42:29

标签: django django-models django-forms

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

# 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并进行一些自定义验证,没什么特别的。

我已经看到一些适用于常规表单的解决方案,但没有任何与modelformsets一起使用。

1 个答案:

答案 0 :(得分:0)

您可以使用功能方法(curry),闭包或回调动态更改表单上的查询集。请参阅“passing custom form parameters to formset”的前三个答案中的所有三种方法。

另请参阅James Bennetts发表的“So you want a dynamic form”,以便对闭包方法进行深入的讨论。