2017-04-25 10 views
0

私は本当に自分自身に説明できないdjango formsetに問題があります。 ここにコードがあります。django formsetは余分な(そしてブランクの)行を投稿します

forms.py:

class ScoreForm(forms.ModelForm): 
    class Meta: 
     model = models.Score 
     fields = (
      'period', 
      'home_team_score', 
      'away_team_score', 
     ) 


ScoreFormSet = forms.inlineformset_factory(
    models.Fixture, 
    models.Score, 
    form=ScoreForm, 
    extra=5 
) 

models.py:

class Score(models.Model): 
    fixture = models.ForeignKey(Fixture, related_name="score") 
    user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name="score") 
    inserted_at = models.DateTimeField(auto_now_add=True, blank=True, null=True) 
    period = models.IntegerField(blank=True, null=True) 
    home_team_score = models.IntegerField(blank=True, null=True) 
    away_team_score = models.IntegerField(blank=True, null=True) 

    class Meta: 
     db_table = 'score' 

views.py:

class InsertScoreView(CreateView): 
    form_class = forms.ScoreForm 
    model = Score 
    template_name = 'gamestream/insert_score.html' 
    success_url = "/gamestream/score_list/" 

    def get_context_data(self, **kwargs): 
     fixture = Fixture.objects.get(id=self.kwargs['fixture_id']) 
     data = super(InsertScoreView, self).get_context_data(**kwargs) 
     if self.request.POST: 
      data['scores'] = forms.ScoreFormSet(self.request.POST) 
      data['fixture'] = fixture 
     else: 
      data['scores'] = forms.ScoreFormSet() 
      data['fixture'] = fixture 
     return data 

    def form_valid(self, form, **kwargs): 
     user = self.request.user 
     fixture = Fixture.objects.get(id=self.kwargs['fixture_id']) 
     context = self.get_context_data() 
     formset = forms.ScoreFormSet(self.request.POST) 
     if formset.is_valid(): 
      scores = formset.save(commit=False) 
      for score in scores: 
       score.fixture = fixture 
       score.user = user 
       score.save() 

     return super(InsertScoreView, self).form_valid(form) 

とテンプレート:

<div class="container"> 
    <h3>Please insert scores for the following match:</h3> 
    <h4>{{ fixture.starting_time }} -- {{ fixture.league.league_name }} -- {{ fixture.home_team }} vs {{ fixture.away_team }}</h4> 

    <form action="." method="POST"> 
    {% csrf_token %} 
    {{ scores.management_form }} 
    {% for form in scores %} 
     <p>{{ form }}</p> 
    {% endfor %} 
     <input type="submit" value="Insert score" class="submit" /> 
    </form> 
</div> 

私はこの動作を得ます: 私はすべての値を挿入することができます。 1または5が挿入されてdbに保存されても問題ありません(これは正しいです、それが私が達成したいことです)。 問題はそのように見え、余分な100%の空白のフォームが送信され、検証されません(フィクスチャフィールドが必要なため)! 私はScoreモデルのフィクスチャフィールドの制約をテスト目的で削除しましたが、実際には完全な空白行がdbに挿入されています。 これは、私が空白のフォームが送信されていると考えている理由です。

私は本当にこの動作を説明することはできません。その空白のフォームはどこから来たのですか? CREATEVIEWからFormViewコントロールに 、それは突然うまく動作し始めた:

おかげで、 ヴィットリオ

答えて

0

はそうしようと多くの後、私は、ビューの種類を変更しました。

2つのクラス間のコードの違いがわからないので、これ以上の情報を提供することはできません。

関連する問題