私は本当に自分自身に説明できない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コントロールに 、それは突然うまく動作し始めた:
おかげで、 ヴィットリオ