有没有办法在urls.py中使用django捕获URL参数?

时间:2011-06-25 19:08:12

标签: python django

我正在尝试写一些优雅的东西,我不依赖于代码中的Request对象。所有示例都使用:     (r'^ hello /(?P。*)$','foobar.views.hello') 但似乎你不能轻易地使用表单发布到这样的URL。有没有办法让该URL响应.... / hello?name = smith

2 个答案:

答案 0 :(得分:3)

绝对。如果你的url被映射到一个函数,在本例中是foobar.views.hello,那么对于GET请求,该函数可能如下所示:

def hello(request):
    if request.method == "GET":
        name_detail = request.GET.get("name", None)

        if name_detail:
            # got details
        else:
            # error handling if required.

如果您从request.POST发送HTTP POST,则可以使用编码形式的数据,即POST参数。

如果你想要在POST请求中查询参数,你也可以自己构建这些。就这样做:

PARAMS = dict()
raw_qs = request.META.get('QUERY_STRING', '') # this will be the raw query string
if raw_qs:
    for line in raw_qs.split("&"):
        key,arg = line.split("=")
        PARAMS[key] = arg

同样,对于非POST请求中的表单编码参数,请执行以下操作:

FORM_PARAMS = QueryDict(request.raw_post_data)

但是,如果您尝试使用Django表单,那么您一定要看django.forms。整个表格库通常会让您的生活更轻松;我从未使用Django手工编写html表单,因为Django的这一部分完成了所有的工作。作为快速摘要,您可以这样做:

<强> forms.py

class FooForm(forms.Form):
    name = fields.CharField(max_length=200)
    # other properties

甚至是这样:

class FooForm(forms.ModelForm):

    class Meta:
         model = model_name

然后在您的请求中,您可以将表单传递给模板:

def pagewithforminit(request):
    myform = FooForm()
    return render_to_response('sometemplate.html', {'nameintemplate': myform}, 
                                    context_instance=RequestContext(request))

并且在收到它的视图中:

def pagepostingto(request):
    myform = FooForm(request.POST)

    if myform.is_valid(): # check the fields for you:
        # do something with results. if a model form, this:
        myform.save()
        # creates a model for you.

另见model forms。简而言之,我强烈推荐django.forms。

答案 1 :(得分:0)

您无法在网址格式中捕获GET参数。正如您在django.core.handlers.base.BaseHandler.get_response中所看到的,只有request.path_info中以URL结尾的部分用于解析网址:

callback, callback_args, callback_kwargs = resolver.resolve(
         request.path_info)

request.path_info不包含GET参数。处理这些问题,请参阅Ninefingers的答案。