Python 如何更新django表单集?

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

我不熟悉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',)
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