我有一个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插入并保存到数据库中则无关紧要(这是正确的,这就是我想要实现的目标)。 问题是它看起来像是额外的100%空白表单被发送并且不验证(因为需要夹具字段)! 我已经删除了Score模型的fixture字段中的约束(用于测试目的),实际上一个完全空白的行被插入到db中。 这就是为什么我相信一个空白表格正在发送。
我无法解释这种行为。这个空白形式(或其他什么)来自哪里?
谢谢, 维托里奥
答案 0 :(得分:0)
经过多次尝试后我改变了视图的类型: 从CreateView到FormView,它突然开始正常工作。
我无法真正提供更多相关信息,因为我真的不知道这两个类之间代码的区别是什么。