[英]How to update a django formset?
我是 Django 和 web 开发的新手。 我正在使用表单集将数据保存到数据库中。 创建部分工作正常,但是当我尝试使用表单集更新数据库中的现有数据时遇到问题。
以下是相关的代码片段:
楷模:
from django.db import models
class GradingSchemeName(models.Model):
name = models.CharField(max_length=250, null=False, blank=False, unique=True)
class GradingScheme(models.Model):
scheme_name = models.ForeignKey(to=GradingSchemeName, on_delete=models.CASCADE)
grade = models.CharField(max_length=250, null=False, blank=False)
score_range_begin = models.SmallIntegerField()
score_range_end = models.SmallIntegerField()
class Meta:
unique_together = ('scheme_name', 'grade',)
forms:
from django.forms import ModelForm, inlineformset_factory
GradeFormSet = inlineformset_factory(
parent_model=GradingSchemeName, model=GradingScheme,
fields=['scheme_name', 'grade', 'score_range_begin', 'score_range_end'],
extra=10, max_num=100, can_delete=False
)
意见:
# Passing the pre-filled form for rendering. For the sake of illustration, I have hardcoded the `id=1`:
instance = GradingSchemeName.objects.get(id='1')
context['grade_formset'] = GradeFormSet(instance=instance)
# checking the request data from the post(request) on form submission:
grades_formset = GradeFormSet(request.POST, instance=instance)
请注意,在创建表单集期间,3 条记录保存在GradingScheme
Model 中。 当我尝试使用上述方法进行更新时,我看到grades_formset
有 13 条记录(3 条来自instance
属性,10 条来自额外表单)。 该问题是在执行is_valid()
方法时引起的:
if not grades_formset.is_valid():
messages.error(request, 'Form data is invalid!')
is_valid()
方法为 3 条记录中的每条记录抛出以下错误:
不确定,如何解决上述两个错误。 任何指针都会非常有帮助。 提前致谢。
我喜欢基于类的视图,所以这将是我对您的问题的可能解决方案:
from django.db import transaction
class GradeUpdateView(UpdateView):
template_name = 'Your Template'
form_class = yourtemplateForm
model = GradingSchemeName
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
if self.request.method == 'POST':
context['formset'] = GradeFormSet(self.request.POST, instance=self.object)
else:
context['formset'] = GradeFormSet(instance=self.object)
return context
def form_valid(self, form):
context = self.get_context_data()
formset = context['formset']
with transaction.atomic():
self.object = form.save()
if formset.is_valid():
formset.instance = self.object
formset.save()
return redirect('your url')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.