0

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

/NECapp/offers/ offer() 处的 TypeError 恰好需要 2 个参数(给定 1 个)

http://dpaste.com/757822/获取完整跟踪

该应用程序的快速概述:用户输入邮政编码并获得与该值相关的对象列表。无论我修改什么,代码总是在这一点上出现不同的错误,所以我将在这里转储大部分代码。由于我尝试过的事情很多,导入中可能有不必要的代码行,可能还有其他地方,所以要小心。

视图.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'),   
)

我将不胜感激任何帮助!

4

3 回答 3

1

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

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

你需要解决两件事:

1)根据您的 URL 模式,您的请求 URL 应该是 /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">

网址.py:

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

视图.py:\

def offers(request):
    zip=request.POST.get("zip")
    return HttpResponse('you entered %zip' %(zip))
于 2012-06-12T03:37:33.327 回答
0

仔细查看您的 urls.py

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

与冲突

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

于 2012-06-12T03:24:40.107 回答
0

要使其工作(NECapp/offers/URL),您只需将默认值添加到zip.

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

  1. 当“ /offers/”之后有某些内容时(您已传递邮政编码)-为此,您的 url 模式倒数第二个(带有 的那个name='offers'),
  2. 当“”之后没有任何内容时/offers/(为此,您有最后一个 URL 模式)。

您的视图看起来与此类似:

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”作为响应,因为您没有zip在 URL 中传递(实际上是在查询字符串中,如果您想传递,您应该在 URL 的主要部分传递它使用您的 URLconf)。

所以,简而言之,使用我的解决方案并zip像这样传递 URL http://localhost:8000/NECapp/offers/55104:. 或者,您可以摆脱这种模式,zip只使用从查询字符串request.GET.get(zip)中获取。zip

于 2012-06-12T03:38:17.757 回答