Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python id该字段为必填字段-Django formset中出现错误_Python_Django_Django Forms - Fatal编程技术网

Python id该字段为必填字段-Django formset中出现错误

Python id该字段为必填字段-Django formset中出现错误,python,django,django-forms,Python,Django,Django Forms,我正在使用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__

我正在使用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()
我在这里创建了一个表格集,我的表格应该得到所有科目的分数。通过使用Subject_赋值,我可以获取特定用户的所有主题

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})
def事后调查(请求,主键):
#post=获取对象或404(标记调查,pk=pk)
SurveyFormSet=modelformset\u工厂(调查标记,字段=('marks','Subject'),额外=0)
如果request.method==“POST”:
formset=SurveyFormSet(request.POST、request.FILES)
打印(formset.data)
打印(formset.errors)
如果formset.is_有效():
post=formset.save(commit=False)
post.mark_survey=pk
post.user=request.user
post.save()
html=“Success”%now
返回HttpResponse(html)
其他:
打印(“失败”)
html=“失败”
返回HttpResponse(html)
其他:
user=request.user
profile=get\u object\u或\u 404(profile,user\u id=user.id)
formset=SurveyFormSet(queryset=Subject\u Assignment.objects.filter(Q(board=profile.board)和Q(group=profile.group)))
返回呈现(请求'subject\u assignment\u 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>

{%csrf_令牌%}
{{formset.management_form}
{formset%中表单的%s}
{%用于隐藏在表单中。隐藏的_字段%}
{{隐藏}}
{%endfor%}
{{form}}
{%endfor%}

解决方案是为每个主题实例的
标记提供一个值

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
参数控制,因此我将
Subject
s的数量指定给
extra
参数并传递初始数据

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