django formset 发布一个额外的(和空白的)行

django formset posts an extra (and blank) row

我有一个 django 表单集的问题,我无法真正向自己解释。 下面是相关代码。

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 个都没有关系(这是正确的,这就是我想要实现的目标)。 问题是它看起来像额外的 100% 空白表格被发送通过并且不验证(因为 fixture 字段是必需的)! 我已经删除了 Score 模型的 fixture 字段中的约束(用于测试目的),实际上一个完全空白的行被插入到数据库中。 这就是为什么我认为发送的是空白表格。

我真的无法解释这种行为。空白表格(或其他表格)从何而来?

谢谢, 维托里奥

经过多次尝试,我改变了视图的类型: 从 CreateView 到 FormView,它突然开始正常工作了。

我真的无法提供更多信息,因为我真的不知道 2 类 之间的代码有什么区别。

我在 forms.py 中使用了表单助手,并且在表单集的顶部有一个额外的行 self.template = 'bootstrap3/table_inline_formset.html' 我只是将它更改为 bootstrap4 并且它工作正常 self.template = 'bootstrap4/table_inline_formset.html'