Django formset无效 - 为什么不这样 [英] Django formset is not valid- why not?

查看:163
本文介绍了Django formset无效 - 为什么不这样的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用一个表单来允许用户将图像上传到我在Django项目中存储在数据库中的项目,但是我正在获得控制台输出,告诉我 formset 我正在使用的是无效的...



我试图将图像上传到项目的视图已经被定义为:

$ b

  def upload_budget_pdfs(request,project_id):
project = Project.objects.get(id = project_id)
print(value_btget_pdfs()'中的项目的值)

presentations = project.budget_versions.select_related('meeting')。prefetch_related('budget_items','cci_items' ,'presenters')。filter(version_number__isnull = False).annotate(vn = F('version_number')* -1).order_by('presentation_date','created','-vn')
print 'upload_budget_pdfs()'中的演示文稿的值:,演示文稿)
drawing_formset = DrawingUploadFormset(prefix =drawing s,queryset = Drawing.objects.filter(budget__in = presentationations).order_by('budget__presentation_date','budget__created'))
print(upload_budget_pdfs()中的drawing_formset的值:,drawing_formset)

如果drawing_formset.is_valid():
打印'保存drawing_formset'
打印之前,[b.id for b in project.budget_versions.all()]
对于drawing_formset中的drawing_form:
如果drawing_form.instance.budget:
打印'Instance',drawing_form.instance.budget
drawing = drawing_form.save(commit = False)
绘图。 budget = drawing_form.instance.budget
drawing.save()
打印图纸,[b.id for b in project.budget_versions.all()]
else:print'图形表单不正确。',drawing_formset.errors

budget_formset = BudgetPresentationFormset(request.POST,request.FILES,instance = project,prefix =prese ntations)

如果budget_formset.is_valid()和budget_formset.has_changed():
updated_budget_presentations = budget_formset.save()
elif budget_formset.has_changed():print'Budget formset没有效果',budget_formset.errors



return HttpResponseRedirect(reverse('projects:concept',args = [project_id]))

$ p $ >

(在upload_budget_pdfs()中的项目值:,<项目:测试1>)



(upload_budget_pdfs()'中的演示文稿的值:,[<预算:测试1:版本-1>预算:测试1:版本-1>,<预算:测试1:版本0>,<预算:测试1:版本0>,,,,,,,,,,,,,,,,,,,'。 ..(剩余元素被截断)...'])



(upload_budget_pdfs()'中的drawing_formset的值:,< django.forms.formsets。 DrawingFormFormSet对象位于0x10cee3790>)



图形表单无效。 []


所以很明显,我看来的 else 正在运行,但是我不知道为什么,因为控制台清楚地表明变量都保存正确的数据...



方式我在这里初始化 drawing_formset 变量?是 queryset 我正在传入 DrawingUploadFormset(...)正确吗? is_valid()实际检查?



修改



我在接受的答复中进行了更改,所以我的 drawing_formset 的声明现在是:

  drawing_formset = DrawingUploadFormset(request.POST,request.FILES,prefix =drawings,queryset = Drawing.objects.filter(budget__in = presentationations).order_by('budget__presentation_date' ,'budget__created'))

但是看来我现在得到一个内部服务器错误 MultiValueDictKeyError 在线上:

  for drawing_form在drawing_formset中:#This line是什么导致MultiValueDictKeyError 

我不明白为什么会这样?任何建议?

解决方案

您的表单不包含任何数据。您需要通过 request.POST request.FILES 作为第一个和第二个参数(或作为数据文件关键字参数),但只有当它是一个实际的表单提交。



如果没有数据传入表单或表单集,则被视为未绑定,并将返回 False 而不检查错误。



通常的模式是在 request.method =='POST'时传递它们,然后验证表单:

  def upload_budget_pdfs(request,project_id):
...
if request.method == 'POST':
drawing_formset = DrawingUploadFormset(request.POST,request.FILES,prefix ='drawings',queryset = ...)
如果drawing_formset.is_valid():
#save formset
return HttpResponseRedirect(...)
else:
drawing_formset = DrawingUploadFormset(prefix ='drawings',queryset = ...)
返回渲染(...)#渲染formset

这将在GET上显示一个空白表单,一个填写的表单,错误消息在失败提交,并将保存表单并重定向成功提交。


I am trying to use a form to allow users to upload images to projects stored in a database in my Django project, however, I'm currently getting console output that's telling me that the formset I'm using is not valid...

The view that I'm trying to use to upload the images to a project has been defined with:

def upload_budget_pdfs(request, project_id):
    project = Project.objects.get(id=project_id)
    print("Value of project in 'upload_budget_pdfs()': ", project)

    presentations = project.budget_versions.select_related('meeting').prefetch_related('budget_items', 'cci_items', 'presenters').filter(version_number__isnull=False).annotate(vn=F('version_number') * -1).order_by('presentation_date', 'created', '-vn')
    print("Value of presentations in 'upload_budget_pdfs()': ", presentations)
    drawing_formset = DrawingUploadFormset(prefix="drawings", queryset=Drawing.objects.filter(budget__in=presentations).order_by('budget__presentation_date', 'budget__created'))
    print("Value of drawing_formset in 'upload_budget_pdfs()': ", drawing_formset)

    if drawing_formset.is_valid():
        print 'Saving drawing_formset'
        print "Before", [b.id for b in project.budget_versions.all()]
        for drawing_form in drawing_formset:
            if drawing_form.instance.budget:
                print 'Instance', drawing_form.instance.budget
                drawing = drawing_form.save(commit=False)
                drawing.budget = drawing_form.instance.budget
                drawing.save()
            print drawing, [b.id for b in project.budget_versions.all()]
    else: print 'Drawing formset not valid.',drawing_formset.errors

    budget_formset = BudgetPresentationFormset(request.POST, request.FILES, instance=project, prefix="presentations")

    if budget_formset.is_valid() and budget_formset.has_changed():
        updated_budget_presentations = budget_formset.save()
    elif budget_formset.has_changed(): print 'Budget formset not valid.',budget_formset.errors



    return HttpResponseRedirect(reverse('projects:concept', args=[project_id]))

and the console output I'm getting when this view is called is:

("Value of project in 'upload_budget_pdfs()': ", < Project: Test 1 >)

("Value of presentations in 'upload_budget_pdfs()': ", [< Budget: Test 1: Version -1 >, < Budget: Test 1: Version -1 >, < Budget: Test 1: Version 0 >, < Budget: Test 1: Version 0 >, , , , , , , , , , , , , , , , , '...(remaining elements truncated)...'])

("Value of drawing_formset in 'upload_budget_pdfs()': ", < django.forms.formsets.DrawingFormFormSet object at 0x10cee3790 >)

Drawing formset not valid. []

So it's clear that the else statement in my view is what is being run here, but I'm not sure why, given that the console clearly indicates that the variables all hold the correct data...

What is wrong with the way I am initialising the drawing_formset variable here? Is the queryset I'm passing into DrawingUploadFormset(...) correct? What does is_valid() actually check?

Edit

I made the change in the accepted answer, so that my declaration of drawing_formset is now:

        drawing_formset = DrawingUploadFormset(request.POST, request.FILES, prefix="drawings", queryset=Drawing.objects.filter(budget__in=presentations).order_by('budget__presentation_date', 'budget__created'))

But it seems I'm now getting an 'Internal Server Error' and MultiValueDictKeyError on the line:

for drawing_form in drawing_formset: #This line is what's causing the MultiValueDictKeyError

I don't understand why this is? Any suggestions?

解决方案

Your formset does not contain any data. You need to pass request.POST and request.FILES as the first and second argument (or as the data and files keyword arguments), but only if it is an actual form submission.

If there is no data passed into a form or formset, it is considered unbound, and will return False without checking for errors.

The usual pattern is to pass them when request.method == 'POST', and then validate the formset:

def upload_budget_pdfs(request, project_id):
    ...
    if request.method == 'POST':
        drawing_formset = DrawingUploadFormset(request.POST, request.FILES, prefix='drawings', queryset=...)
        if drawing_formset.is_valid():
            # save formset
            return HttpResponseRedirect(...)
    else:
        drawing_formset = DrawingUploadFormset(prefix='drawings', queryset=...)
    return render(...)  # Render formset

This will show a blank form on GET, a filled-in form with error messages on an unsuccessful submission, and it will save the formset and redirect on a successful submission.

这篇关于Django formset无效 - 为什么不这样的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆