Python 如何更新django表单集?
我不熟悉Django和web开发。我正在使用表单集将数据保存到数据库中。创建部分工作得很好,但当我尝试使用表单集更新数据库中的现有数据时,会遇到问题 以下是相关的代码片段: 型号:Python 如何更新django表单集?,python,django,formset,Python,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 G
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',)
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)
表格:
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',)
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)
视图:
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',)
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)
请注意,在创建表单集期间,GradingScheme
模型中保存了3条记录。当我尝试使用上述方法更新时,我看到grades\u formset
有13条记录(3条来自实例属性,10条来自额外表单)。当执行is\u valid()
方法时,会导致该问题:
if not grades_formset.is_valid():
messages.error(request, 'Form data is invalid!')
is\u valid()
方法为3条记录中的每一条抛出以下错误:
- id:此字段为必填字段
- “errorlist非字段”:具有此方案名称和等级的评分方案已存在
不确定,如何修复上述两个错误。任何指示都会非常有用。提前感谢。我喜欢基于类的视图,因此这将是我解决您问题的可能方法:
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')
我不知道如何使用form_类,我会检查一下。顺便说一句,我也在使用CBV,但是,视图代码太大,无法在StackOverflow中显示。下面是指向视图的完整实现的链接-。欢迎您的评论!为什么要在验证中使用scheme_name_id来知道它属于哪个方法?使用self.object就足以知道您要修改哪个对象。GradingSchemeNameForm进入form_类,这样它工作得更好,并且不需要选择类中的字段感谢您的反馈。我正在使用scheme\u name\u id
确定要更新的GradingScheme
。我的模板()有两种形式。第一种形式设置了方案\u名称\u id
,基于此选择,我将值填充到第二种形式中。第二种形式是GradeFormSet
。