【问题标题】:id the field is required - error in Django formsetid 该字段是必需的 - Django formset 中的错误
【发布时间】:2020-02-01 16:54:25
【问题描述】:

我正在使用 Django 2.2。我的模型是

class Group(models.Model):
    group_name = models.CharField(max_length=100)
    def __str__(self):
        return self.group_name
class Category(models.Model):
    category_name = models.CharField(max_length=50)
    def __str__(self):
        return self.category_name
class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    board = models.CharField(choices=board_options,max_length=1,null=True)
    group = models.ForeignKey(Group,on_delete=models.CASCADE,null=True)

class Subject(models.Model):
    subject_name = models.CharField(max_length=50)
    subject_category = models.ForeignKey(Category, on_delete=models.CASCADE)
    subject_photo = models.ImageField(null=True,blank=True)
    def __str__(self):
        return self.subject_name

class Subject_Assignment(models.Model):
    board = models.CharField(choices=board_options,max_length=1,null=True)
    group = models.ForeignKey(Group,on_delete=models.CASCADE,null=True)
    Subject = models.ForeignKey(Subject, on_delete=models.CASCADE)

class Mark_Survey(models.Model):
    survey_name = models.CharField(max_length=50)
    opens_at =  models.DateField()
    ends_at = models.DateField()

class Survey_Mark(models.Model):
    mark_survey = models.ForeignKey(Mark_Survey,on_delete=models.CASCADE)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    Subject = models.ForeignKey(Subject, on_delete=models.CASCADE)
    marks = models.IntegerField()

这里正在为 Survey_Mark 创建一个表单集,我的表单应该获得所有主题的标记。通过使用 Subject_Assignment 我可以获得特定用户的所有主题。以下视图适用于 get 方法,但在 post 方法中会引发错误。

def postsurvey(request,pk):
    #post = get_object_or_404(Mark_Survey, pk=pk)
    SurveyFormSet = modelformset_factory(Survey_Mark, fields=('marks','Subject'),extra=0)
    if request.method == "POST":
        formset = SurveyFormSet(request.POST,request.FILES)
        print(formset.data)
        print(formset.errors)

        if formset.is_valid():
            post = formset.save(commit=False)
            post.mark_survey=pk
            post.user=request.user
            post.save()
            html = "<html><body>Success</body></html>" % now
            return HttpResponse(html)
        else:
            print("failure")
            html = "<html><body>failure </body></html>" 
            return HttpResponse(html)

    else:
        user=request.user
        profile = get_object_or_404(Profile,user_id=user.id)
        formset = SurveyFormSet(queryset=Subject_Assignment.objects.filter(Q(board=profile.board) & Q(group=profile.group)))
        return render(request, 'subject_assignment_detail.html', {'formset': formset})

我正在获取 id 该字段是必需的错误。如果我在模板中使用了 {{ hidden }},那么我会得到 选择一个有效的选择。该选项不是 post 方法中的可用选项之一错误。我想以单一形式获取所有主题的标记并将其保存在相应的表中。我的模板是

<form method="post">
  {% csrf_token %}
  {{ formset.management_form }}


  {% for form in formset %}
  {% for hidden in form.hidden_fields %}
        {{ hidden }}
    {% endfor %}
  {{form}}

  {% endfor %}

  <input type="submit" value="OK">
</form>

【问题讨论】:

    标签: python django django-forms


    【解决方案1】:

    解决方案是为每个主题实例提供marks 的值。

    user=request.user
    profile = get_object_or_404(Profile,user_id=user.id)
    subjects = Subject_Assignment.objects.filter(
        Q(board=profile.board) & Q(group=profile.group)
    )
    SurveyFormSet = modelformset_factory(
        Survey_Mark,
        fields=('marks','Subject'),
        extra=len(subjects)
    )
    

    显示的空表单的数量由extra参数控制,所以我将Subjects的数量指定给extra参数并传递初始数据。

    formset = SurveyFormSet(
        initial=[{'marks':'','Subject':x.id} for x in subjects]
    )
    

    【讨论】:

      猜你喜欢
      • 2012-12-02
      • 2020-06-02
      • 2019-04-13
      • 2016-04-29
      • 1970-01-01
      • 2015-02-11
      • 2021-04-10
      • 2019-03-09
      相关资源
      最近更新 更多