2012-03-17 69 views
0

在我的記分卡輸入表單上,我只希望用戶從該比賽的入圍選手中進行選擇。如果有一個字段,我可以成功地使用重寫。formset_factory並更新字段以僅顯示已過濾項目

form.fields['player'].queryset = PlayerShortlist.objects.filter(team=userteam, fixture=fixture_id) 

但是當我將它應用於formset_factory時,我無法得到結果。

我forms.py

class TossForm(forms.Form): 
    toss_won_by = forms.BooleanField() 
    bat_first = forms.BooleanField() 

class InningsForm(forms.Form): 
    player = forms.ModelChoiceField(
     PlayerShortlist.objects.all() 
    ) 
    status = forms.ChoiceField(choices=OUT_CHOICES, initial='DNB') 
    score = forms.IntegerField(initial=0) 
    balls_faced = forms.IntegerField(initial=0) 

我views.py

@login_required 
def scorecard(request, team_id, fixture_id): 
    template = get_template('cricket/scorecard.html') 
    tossform = TossForm() 
    #inningform = InningsForm() 
    InningsForms = formset_factory(InningsForm, extra=11) 
    inningsforms = InningsForm() 
    inningsforms.fields['player'].queryset = PlayerShortlist.objects.filter(team=Team.objects.get(id=1), fixture=fixture_id) 

    page_vars = Context({ 
     'loggedinuser': request.user, 
     'tossform': tossform, 
     'inningsforms': inningsforms, 
    }) 
    crsfcontext = RequestContext(request, page_vars) 
    output = template.render(crsfcontext) 
    return HttpResponse(output) 

它給我的錯誤。

「InningsFormFormSet」對象有沒有屬性「域」

感謝

//優素福

好,我環顧四周,似乎formfield_callback可以用來做什麼我打算它,但當我使用它霖我views.py就像

def update_field(field, **kwargs): 
     if field.name == 'players': 
      field.queryset = PlayerShortlist.objects.filter(team=Team.objects.get(id=team_id), fixture=fixture_id) 

    InningsFormset = formset_factory(InningsForm, extra=11, formfield_callback) 

它給了我

formset_factory()得到了一個意想不到的關鍵字參數 'formfield_callback'

回答

1

記住:一個formset環繞的表單列表。所以這個:

inningsforms.fields['player'].queryset = PlayerShortlist.objects.filter(team=Team.objects.get(id=1), fixture=fixture_id) 

而應是:

qs = PlayerShortlist.objects.filter(team=Team.objects.get(id=1), fixture=fixture_id) 

# force execution of the queryset once and for all 
list(qs) 

for form in inningsforms.forms: 
    form.fields['player'].queryset = qs 

此外,formfield_callback就是這樣,不是formset_factory modelformset_factory(和modelform_factory)的參數。看看它是如何使用的:

def modelformset_factory(model, form=ModelForm, formfield_callback=None, 
         formset=BaseModelFormSet, 
         extra=1, can_delete=False, can_order=False, 
         max_num=None, fields=None, exclude=None): 
    """ 
    Returns a FormSet class for the given Django model class. 
    """ 
    form = modelform_factory(model, form=form, fields=fields, exclude=exclude, 
          formfield_callback=formfield_callback) 
    FormSet = formset_factory(form, formset, extra=extra, max_num=max_num, 
           can_order=can_order, can_delete=can_delete) 
    FormSet.model = model 
    return FormSet 

請參閱formform_callback通過modelformset_factory代理modelform_factory。

相關問題