【问题标题】:Django Form Error: 'QueryDict' object has no attribute 'method' when POST assignedDjango 表单错误:'QueryDict' 对象在分配 POST 时没有属性'method'
【发布时间】:2017-02-12 17:04:39
【问题描述】:

我遇到了不允许我将数据发布到我定义的函数的特定表单的问题。我很困惑为什么这会给我带来错误,因为我使用几乎相同的表单在同一个网站上执行另一个操作。

当我发布此数据时,Django 会抛出“'QueryDict' 对象没有属性 'method'”,即使我已将方法指定为 POST。它在不发布时呈现表单就好了,只有当我提交时我才有问题。\

Django 抛出的错误指向视图中的这一行: if request.method == "POST": 这是下面“取消”函数中的第一行。

谁能指出我在这里做错了什么?我很茫然。

view.py 中的函数如下:

from django.shortcuts import render
from django.http import HttpResponseRedirect
from django.shortcuts import redirect
from .apps.instant import orderlist, orderdetails, cancel
from .forms import cancelorder

def cancel(request):
    if request.method == "POST":
        form = cancel(request.POST or None)
        if form.is_valid():
            response = cancel(request.session['token'],form.cleaned_data['orderId'], form.cleaned_data['reason'])
            return render(request, 'instant/review.html', {'data':response})
        else:
            form = cancelorder()
            return render(request, 'instant/cancel.html', {'form':form})
    else:
        form = cancelorder()
        return render(request, 'instant/cancel.html', {'form':form})

这是forms.py:

from django import forms

class cancelorder(forms.Form):
    orderId = forms.CharField(label='Order Id', max_length=5)
    reason = forms.CharField(label='reason', widget=forms.Textarea)

这是它正在渲染的模板(instant/cancel.html):

{% extends "main/header.html" %}
{% load widget_tweaks %}
{% block content %}
<div class = "row">
  <div class ="col-sm-3">
  </div>
  <div class ="col-sm-6">
    <div class="alert alert-danger alert-dismissible" role="alert">
      <button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>
      <strong>Warning!</strong> When you cancel, the host gets an email notifiaction! Also, there are no confirmations. Only click cancel if you're sure!
    </div>
  </div>
</div>
<div class = "row">
  <div class ="col-sm-3">
  </div>
  <div class ="col-sm-6">
    <div class="well-lg" style="background-color:#efefef">
      <center>
      <h3> cancel an order</h3>
    </center><br>
      <!-- <h3>Login</h3> -->
      <form action="/instant/cancel/" method="POST" class="post-form">{% csrf_token %}
        <div class="form-group">
          <label for="login_email">Order Id</label>
          {{ form.orderId|add_class:"form-control"|attr:"placeholder:Enter numbers only"}}
        </div>
        <div class="form-group">
          <label for="login_password">Reason</label>
          {{ form.reason|add_class:"form-control"|attr:"placeholder:Why are you cancelling?"}}
        </div>
        <button type="submit" class="btn btn-danger btn-lg">Send Cancellation</button>
      </form>
    </div>
  </div>
</div>
{% endblock %}

最后是表单收集数据的功能。 .apps.instant(我知道我调用的 API 确实起作用):

from time import sleep
import requests
import logging
import json

LOG_FILENAME = 'transaction_log.log' #Production Log
logging.basicConfig(filename=LOG_FILENAME,level=logging.INFO,format='%(asctime)s %(message)s')

url = APIURL (removed for stackoverflow)

def cancel(token,orderId,reason):
    auth_token = {"Authorization" : "bearer " + str(token)}
    raw = {'instabookingId':orderId,"reason":reason}
    info = json.dumps(raw)
    cancellation = requests.post(url, headers=auth_token,data=info)
    response = cancellation.json()
    return response

感谢您提供的任何帮助,真的很想知道为什么这不起作用。

这是 Django 的错误:

Environment:


Request Method: POST
Request URL: http://164.132.48.154:8000/instant/cancel/

Django Version: 1.10.2
Python Version: 2.7.9
Installed Applications:
['main',
 'instant',
 'widget_tweaks',
 'django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']



Traceback:

File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/exception.py" in inner
  39.             response = get_response(request)

File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py" in _get_response
  187.                 response = self.process_exception_by_middleware(e, request)

File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py" in _get_response
  185.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/root/mysite/instant/views.py" in cancel
  24.         form = cancel(request.POST or None)

File "/root/mysite/instant/views.py" in cancel
  23.     if request.method == "POST":

Exception Type: AttributeError at /instant/cancel/
Exception Value: 'QueryDict' object has no attribute 'method'

【问题讨论】:

  • “Django 抛出的错误”为什么不与我们分享。请完整的堆栈跟踪
  • @e4c5 谢谢,这是一个很好的观点。我已经在上面添加了。
  • 你有视图以及其他一些与cancel同名的导入方法
  • @Rohan 是的,我现在看到了,有时额外的眼睛会帮助您长时间盯着同一件事。感谢您的帮助。

标签: python django forms


【解决方案1】:
def cancel(request):
    if request.method == "POST":
        form = cancel(request.POST or None) # you call the function, its the same name, you would call your cancelform
        if form.is_valid():
            response = cancel(request.session['token'],form.cleaned_data['orderId'], form.cleaned_data['reason'])
            return render(request, 'instant/review.html', {'data':response})
        else:

在此,视图中的函数名称为取消。此外,第 3 行 (cancel(request.POST or None)) 中提到的表单名称也是取消。这就是错误。

【讨论】:

    【解决方案2】:

    错误在这一行

    ...
    def cancel(request):
        if request.method == "POST":
            form = cancel(request.POST or None) # you call the function, its the same name, you would call your cancelform
            if form.is_valid():
                response = cancel(request.session['token'],form.cleaned_data['orderId'], form.cleaned_data['reason'])
                return render(request, 'instant/review.html', {'data':response})
            else:
               ...
    

    是递归的,第二次,在cancel函数中,request == request.POST,而request.POST没有属性'method'

    【讨论】:

    • 谢谢,有时只需要外人的眼睛就能捕捉到这些东西。这让我很头疼。
    猜你喜欢
    • 2011-06-23
    • 2020-07-05
    • 2021-02-22
    • 2016-09-30
    • 1970-01-01
    • 2015-10-13
    • 1970-01-01
    • 1970-01-01
    • 2020-02-15
    相关资源
    最近更新 更多