繁体   English   中英

如何更新 django 表单集?

[英]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 条记录中的每条记录抛出以下错误:

  • id:此字段为必填项
  • “errorlist nonfield”:具有此方案名称和等级的评分方案已存在。

不确定,如何解决上述两个错误。 任何指针都会非常有帮助。 提前致谢。

我喜欢基于类的视图,所以这将是我对您的问题的可能解决方案:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM