2009-03-17 3 views
1

그래서 토너먼트라는 ManyToManyField가있는 모델이 있습니다. 두 개의 토너먼트 필드가있는 ModelForm이 있습니다.ManyToManyField를 ModelForm의 여러 양식 필드로 나누기

pay_tourns = forms.ModelMultipleChoiceField(
         queryset=Tourn.objects.all().active().pay_tourns(), 
         widget=forms.CheckboxSelectMultiple()) 
rep_tourns = forms.ModelMultipleChoiceField(
         queryset=Tourn.objects.all().active().rep_tourns(), 
         widget=forms.CheckboxSelectMultiple()) 

서브 클래 싱 된 QuerySet의 메소드가 있습니다. 내 관점에서 양식을 저장할 때 이렇게 :

post.tournaments = (post_form.cleaned_data.get('pay_tourns') 
           + post_form.cleaned_data.get('rep_tourns')) 

어쨌든,이 모든 작동합니다. 어떻게해야할지 모르겠지만 기존 게시물을로드 할 때이 양식 필드를 채우는 것입니다. 즉, 폼에 instance = post를 전달할 때입니다. 어떤 아이디어?

답변

1

파올로 베르 기 티노 (Paolo Bergantino)가 올바른 길을 찾아 도움을주었습니다. 이것은 해결책이었습니다 :

def __init__(self, *args, **kwargs): 
    super(MyForm, self).__init__(*args, **kwargs) 

    instance = kwargs.get('instance') 
    if instance: 
     self.fields['pay_tourns'].initial = [ o.id for o in instance.tournaments.all().active().pay_tourns()] 
     self.fields['rep_tourns'].initial = [ o.id for o in instance.tournaments.all().active().rep_tourns()] 
+0

멋진 솔루션, 좋은 정보. :) –

2

당신은 ModelForm에 이런 일을 할 수있는 : 문제가 해결되지 왜

def __init__(self, *args, **kwargs): 
    super(MyForm, self).__init__(*args, **kwargs) 

    instance = kwargs.get('instance') 
    if instance: 
     self.fields['pay_tourns'].queryset.filter(post=instance) 
     self.fields['rep_tourns'].queryset.filter(post=instance) 

내가 표시되지 않습니다,하지만 난 그냥 확인하기 위해 테스트거야 ...

편집 : 테스트를 거쳤습니다.

+0

저도 작동하지만 필요한 것은하지 않습니다. queryset을 제한하기보다는 해당 게시물과 관련된 항목을 확인해야합니다. 이것이하는 일은 게시물과 관련된 대회 만 옵션이되는지 확인하는 것입니다. – defrex

+0

우우, 알았어. 1 초 후 ... –

관련 문제