2012-03-17 68 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。

相关问题