为什么我的Django表单is_valid()返回false?

时间:2014-09-22 17:29:48

标签: django django-forms django-views

我有点卡住了。有人可以告诉我为什么is_valid()函数返回false并且屏幕上没有显示错误?我尽可能地简化了我的观点,HttpResponseRedirect总是重定向到/information,无论我填写表单的数据是什么。

forms.py

class FantasySeasonForm(ModelForm):
    class Meta:
        model = FantasyTeam

    def __init__(self,*args,**kwargs):
        super(FantasySeasonForm,self).__init__(**kwargs)
        #filter all players to only premier league players
        self.fields['player1'].queryset = Player.objects.filter(team__competition__pk=2)
        self.fields['player2'].queryset = Player.objects.filter(team__competition__pk=2)
        self.fields['player3'].queryset = Player.objects.filter(team__competition__pk=2)
        self.fields['player4'].queryset = Player.objects.filter(team__competition__pk=2)
        self.fields['player5'].queryset = Player.objects.filter(team__competition__pk=2)
        self.fields['player6'].queryset = Player.objects.filter(team__competition__pk=2)
        self.fields['player7'].queryset = Player.objects.filter(team__competition__pk=2)
        self.fields['player8'].queryset = Player.objects.filter(team__competition__pk=2)
        self.fields['player9'].queryset = Player.objects.filter(team__competition__pk=2)
        self.fields['player10'].queryset = Player.objects.filter(team__competition__pk=2)
        self.fields['player11'].queryset = Player.objects.filter(team__competition__pk=2)
        self.fields['player12'].queryset = Player.objects.filter(team__competition__pk=2)
        self.fields['player13'].queryset = Player.objects.filter(team__competition__pk=2)
        self.fields['player14'].queryset = Player.objects.filter(team__competition__pk=2)
        self.fields['player15'].queryset = Player.objects.filter(team__competition__pk=2)

views.py

@login_required
def entry(request):    
    fantasyTeamForm = FantasySeasonForm() #Form to store each player in the fantasy team
    seasonUserTournForm = PartialSeasonEntryForm()

    # If the form has been submitted... 
    if request.method == 'POST':
        fantasyTeamForm = FantasySeasonForm(request.POST or None) # A form bound to the POST data

        if fantasyTeamForm.is_valid():                      
            return HttpResponseRedirect('/season/entrysuccess') #page on success

        else:
            return HttpResponseRedirect('/information') #page on error

    #OTHERWISE A GET REQUEST
    args = {}
    args.update(csrf(request))

    args['form'] = fantasyTeamForm
    args['form2'] = seasonUserTournForm

    return render_to_response('entry.html', args, context_instance=RequestContext(request))

entry.html

    <h2><b>Choose your team:</b></h2><br>

    {% for field in form %}
      {{field.error}}
    {% endfor %}
    {% for field in form2 %}
      {{field.error}}
    {% endfor %}

    <form action="/season/entry/" method="post"> {% csrf_token %}
      {{form2}}
      <br><br>
      {{form.as_ul}}
      <br>
      <input type="submit" value="Submit Team" />         
    </form>

更新

在为球队名称和球员1-7选择了值之后,其余的留空了我在else语句中打印了以下值。

form.is_bound返回True

form.errors返回

<ul class="errorlist"><li>player9<ul class="errorlist"><li>This field is required.</li></ul></li><li>player4<ul class="errorlist"><li>This field is required.</li></ul></li><li>player8<ul class="errorlist"><li>This field is required.</li></ul></li><li>player11<ul class="errorlist"><li>This field is required.</li></ul></li><li>player10<ul class="errorlist"><li>This field is required.</li></ul></li><li>player5<ul class="errorlist"><li>This field is required.</li></ul></li><li>player14<ul class="errorlist"><li>This field is required.</li></ul></li><li>player6<ul class="errorlist"><li>This field is required.</li></ul></li><li>player13<ul class="errorlist"><li>This field is required.</li></ul></li><li>player3<ul class="errorlist"><li>This field is required.</li></ul></li><li>player12<ul class="errorlist"><li>This field is required.</li></ul></li><li>player15<ul class="errorlist"><li>This field is required.</li></ul></li><li>player7<ul class="errorlist"><li>This field is required.</li></ul></li></ul>

form.data返回

<QueryDict: {'player14': [''], 'player9': [''], 'player4': ['3897'], 'team_name': ['Just Amazing'], 'player8': [''], 'player11': [''], 'player10': [''], 'player5': ['3897'], 'player1': ['1934'], 'player12': [''], 'player6': ['13017'], 'player13': [''], 'player2': ['1934'], 'player3': ['3897'], 'csrfmiddlewaretoken': ['H8dIdnepxSgEduPCT6Yiy9iYsLmXqwJy'], 'player15': [''], 'player7': ['13017']}>

1 个答案:

答案 0 :(得分:1)

构建表单时,您应该传递*args**kwargs

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

错过*args,您当前的代码与fantasyTeamForm = FantasySeasonForm(data=None)的效果相同。即使没有错误,is_valid()也会返回False,因为表单未绑定到任何数据。

顺便说一下,你可以循环播放器字段以避免重复:

for player_id in xrange(1, 16)
    field_name = "player%d" % player_id 
    self.fields[field_name].queryset = Player.objects.filter(team__competition__pk=2)