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'
我有一个 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'