Python 2.7 Django 1.9我无法传递2个参数

时间:2018-04-23 03:31:17

标签: python django django-forms django-views

我收到一条错误消息:“submission()正好接受2个参数(给定1个)”并且我怀疑我没有成功传递2个参数。我现在已经奋斗了2天多了。谁能让我快速诊断出错了什么?

这是我的submission.html

<form method="post" action="{% url 'submission' %}" enctype="multipart/form-data">  
{% csrf_token %} 
<div>  
  <td>{{ form.title.label_tag }}</td>  
  <td>{{ form.title }}</td>  
</div>  
<div>  
  <td>{{ form.message.label_tag }}</td>  
  <td>{{ form.message }}</td>  
</div>  
<div> 
  <input type="text" name="image_id"  /> 
  <input type="hidden" name="next" value="{{ next }}" />  
  <input type="submit" value="Store Post" />  

</div>
<a href="/discussion/registration">Register for an account</a><br>
<a href="/login">Login</a><br>
<a href="/logout/">Logout</a><br>
<a href="/discussion/">See All Comments</a><br>
<a href="/discussion/submission/">Submit</a>
</form> 

这是我的view.py的一部分。目的是尝试上传图像文件。

def submission(request, image_id):
    form = PostForm()
    if request.user.is_authenticated() and request.method == 'POST':
        form = PostForm(request.POST)
        if form.is_valid() == True:
            post_to_submit = Post()
            post_to_submit.post_title = form.cleaned_data['title']
            post_to_submit.post_text = form.cleaned_data['message']
            post_to_submit.pub_date = datetime.datetime.now()
            post_to_submit.user = request.user
            post_to_submit.save()
            image = Image.objects.get(id=image_id)
            image.comments.add(post_to_submit)
            template = loader.get_template('discussion/index.html')
            post_list = Post.objects.order_by('-pub_date') 
            context = {'post_list': post_list, 'image_id' : image_id}
        else:
            return HttpResponse(form.errors.__str__())
    elif request.user.is_authenticated() and request.method != 'POST':
        form = PostForm()
        template = loader.get_template('discussion/submission.html')
        context = {'form' : form, 'image_id' : image_id}
    elif request.user.is_authenticated() == False:
        template = loader.get_template('registration/login.html')
        context = {}
    return HttpResponse(template.render(context, request, {'image':image}))

1 个答案:

答案 0 :(得分:1)

我不确定只能解决您发布的问题,因为我看到您的代码中存在许多错误......结构不好。说明

  

希望这可以帮助您发现您在代码中搞砸了哪些内容。

1)用户身份验证/ Request.GET :重定向到提交模板,其中formid为变量。在该模板中,表单action需要一个必需的参数image_id,因为它在def submission(request, image_id):中清晰显示。
通过此链接<a href="/discussion/submission/">Submit</a>,我实际上意识到您没有设置您的网址以接收任何参数 return HttpResponse(template.render(context, request, {'image':image}))将生成NameError: name 'image' is not defined

2)用户未经过身份验证/任何请求:您呈现的模板registration/login.html没有上下文变量。
在这种情况下 此行return HttpResponse(template.render(context, request, {'image':image}))将生成NameError: name 'image' is not defined

3)User Authenticated / Request.POST :当用户提交表单时。 如果表单有效,您将不会收到任何错误,因为image变量存在:

'''your codes'''
image = Image.objects.get(id=image_id)
image.comments.add(post_to_submit)

解决问题的可能方法已发布

您可以通过上下文发送image_id并通过表单内的隐藏输入发回,而不是通过表单操作网址发送回来。您无需在论坛中提出论点。 def submission(request)

<input type="hidden" value="{{ image_id }}" name="image_id" />

如果您需要url中的image_id,只需添加正则表达式参数即可正确设置urls.py,并通过添加image_id参数来编辑表单操作网址

<form method="post" action="{% url 'submission' image_id %}" enctype="multipart/form-data">