신청 : 이것은 회의를위한 워크샵 제안 시스템입니다. 사용자는 발표자와 워크샵을 만들고 함께 연결할 수 있습니다. 각 사용자는 자신이 생성하거나 소유 한 발표자와 워크샵에만 액세스 할 수 있어야합니다. 어떻게하면 장고 modelformset에서 외래 키 필드에 사용할 수있는 선택을 제한 할 수 있습니까?
# 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
에 대한 modelformset을 포함, 워크샵 특정 페이지로 이동되어, 워크숍에 발표자를 연결합니다. 워크샵 및 카디널리티는 formset이 채워진 후보기에 의해 설정되므로 사용자는 가능한 발표자 이름이있는 드롭 다운 목록 만 볼 수 있습니다.
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에서는 작동하지 않는 해결책을 보았습니다.
정말 깨끗해지기 위해 잠시만 시간을 보냈지 만 제임스 베넷 링크는 매우 좋습니다. 그 사용자에 맞는 양식 클래스를 동적으로 정의하고 리턴하는 getWorkshopPresenterForm (request.user) 함수를 작성하는 것을 끝내기. – modulatrix