2009-11-15 3 views
1

신청 : 이것은 회의를위한 워크샵 제안 시스템입니다. 사용자는 발표자와 워크샵을 만들고 함께 연결할 수 있습니다. 각 사용자는 자신이 생성하거나 소유 한 발표자와 워크샵에만 액세스 할 수 있어야합니다. 어떻게하면 장고 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()) 

WorkshopPresenterFormSetBaseModelFormSet를 확장하고 일부 사용자 지정 유효성 검사, 공상 아무것도 않습니다.

일반 양식에서는 작동하지만, modelformsets에서는 작동하지 않는 해결책을 보았습니다.

답변

0

함수 메서드 (카레), 클로저 또는 콜백을 사용하여 폼의 쿼리 세트를 동적으로 변경할 수 있습니다. "passing custom form parameters to formset"의 처음 세 가지 대답에서 세 가지 방법을 모두 확인하십시오.

제임스 베넷 (James Bennetts)도 "So you want a dynamic form"게시물을 통해 클로저 방법에 대해 자세히 설명합니다.

+0

정말 깨끗해지기 위해 잠시만 시간을 보냈지 만 제임스 베넷 링크는 매우 좋습니다. 그 사용자에 맞는 양식 클래스를 동적으로 정의하고 리턴하는 getWorkshopPresenterForm (request.user) 함수를 작성하는 것을 끝내기. – modulatrix