Django视图不接受url参数

时间:2012-06-12 03:21:29

标签: django django-views django-urls

我一直在尝试在django中开发一个简单的Web应用程序,但我遇到了一个错误。基本上,不接受在网址中传递的参数,我得到了

/ NECapp /的/ offers()只需要2个参数(给定1个)

完整跟踪

http://dpaste.com/757822/

应用程序的简要概述:用户输入邮政编码并获得与该值相关的对象列表。无论我修补什么,代码总是在这一点上突然出现不同的错误,所以我将在这里抛弃大部分代码。由于我尝试了很多东西,导入的代码可能不必要,也许在其他地方,所以要小心。

views.py

from django.shortcuts import render_to_response
from django.http import HttpResponse
from models import Offer, ZipCode
from django.http import HttpRequest

def index(request):
    return render_to_response('NECapp/index.html')

def enterzipcode(request):
    return render_to_response('NECapp/enterzipcode.html')

def offers(request, zip):
    return HttpResponse('you entered %zip' %(zip))

应用的urls.py

from django.conf.urls import patterns, include, url
from django.views.generic import ListView

from NECapp.models import Offer
from NECapp import views


# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('NECapp',
    url(r'^$', 'views.index', name='index'),
    url(r'^enterzip/$', 'views.enterzipcode', name='zipcode'),
    url(r'^offers/(?P<zip>\d{5})/$', 'views.offers', name='offers'),
    url(r'^offers/$', 'views.offers'),   
)

我非常感谢任何帮助!

3 个答案:

答案 0 :(得分:1)

出现错误是因为当您调用URL / NECapp / offers /?zip = 55104时,由于您已将zip作为查询字符串而非参数传递,因此第二个提供了URL模式,因为您没有给出任何默认参数显示错误。     异常值:offers()只需要2个参数(给定1个)

def offers(request, zip):
    return HttpResponse('you entered %zip' %(zip))

你需要解决两件事:

1)根据您的网址格式,您的请求网址应为/ NECapp / offers / 55104 / 2)每当调用第二个URL模式时,您将收到错误。默认情况下将其固定为args。

def offers(request, zip=""):
    return HttpResponse('you entered %zip' %(zip))

如果您尝试通过表单发布数据,请在表单标记中输入method =“POST”,并且您不需要两个URI模式,因为您的request.POST字典中将提供所有表单数据。 HTML:

<form action="/NECapp/offers/" method="post">

URLS.py:

url(r'^offers/$', 'views.offers'),   

Views.py:\

def offers(request):
    zip=request.POST.get("zip")
    return HttpResponse('you entered %zip' %(zip))

答案 1 :(得分:0)

仔细查看你的urls.py

url(r'^offers/(?P<zip>\d{5})/$', 'views.offers', name='offers'),

冲突
url(r'^offers/$', 'views.offers'),   

HTH!

答案 2 :(得分:0)

要使其有效(NECapp/offers/网址),您只需将默认值添加到zip

这是因为您在两种情况下执行views.offers视图,具体取决于请求的URI:

  1. 当“/offers/”之后有某些内容(您已通过邮政编码)时 - 为此,您的网址格式从末尾开始是第二个(name='offers'),
  2. /offers/”之后没有任何内容(为此你有最后一个网址格式)。
  3. 您的观点与此类似:

    def offers(request, zip=None):
        if zip is None:
            # No zip has been set (/offers/)
            return HttpResponse('you did not enter anything')
        else:
            # Some zip has been set (/offers/some_zip)
            return HttpResponse('you entered %zip' %(zip))
    

    修改

    Vivek正确地指出,您正在调用http://localhost:8000/NECapp/offers/?zip=55104而不是http://localhost:8000/NECapp/offers/55104。这就是为什么您将最后一个URI模式匹配(具有r'^offers/$'规则的模式),并且在没有参数的情况下调用视图。如果您将使用我的解决方案,您将得到“you did not enter anything”作为回应,因为您没有在URL中传递zip(实际上您是,但在查询字符串中,您应该在主要传递它相反,如果您想使用您的URLconf,则为URL的一部分。

    因此,简而言之,请使用我的解决方案并在网址中传递ziphttp://localhost:8000/NECapp/offers/55104。或者,您可以使用zip摆脱此模式,只需使用request.GET.get(zip)从查询字符串中获取zip