【问题标题】:Django HTTPResponseRedirect & Reverse with optional parameter带有可选参数的 Django HTTPResponseRedirect & Reverse
【发布时间】:2014-02-02 11:12:40
【问题描述】:

如何使用 Django 的 Reverse 和可选参数来获取信息?我一直在努力

views.py:

def cartForm(request, prod):
    if request.method=="POST":
        quantity = request.POST.get('quantity', False)
        if quantity:
            add_to_cart(request, prod, quantity)
            return HttpResponseRedirect(reverse("cart"))
        #if no quantity indicated, display error message
        return HttpResponseRedirect(reverse('products.views.info', kwargs={'prod': prod, 'error':True}))

def info(request, prod, error=False):
    prod = Product.objects.get(id=prod)
    return render(request, "products/info.html", dict(product = prod, error=error))

urls.py:

url(r'^(?P<prod>\d+)/', "products.views.info", name='info'),

我不断收到以下错误:

Reverse for 'products.views.info' with arguments '()' and keyword arguments '{'prod': u'2', 'error': True}' not found. 1 pattern(s) tried: ['products/(?P<prod>\\d+)/']

【问题讨论】:

  • 您确定您的网址没有重复吗?匹配错误显示的模式与您的urls.py sn-p 显示的模式不同。
  • @BurhanKhalid:Django 允许在部分 URL 下包含 url 模式;此模式包含在'products/' 下。
  • @MartijnPieters 我的意思是模式是(?P\d+)(但后来我编辑了帖子,因为它实际上给出了正确的错误);然后我意识到当模式只映射到一个时,有 两个 关键字被传入;所以我的问题仍然存在。
  • @BurhanKhalid:这就是问题的症结所在; OP 期望 error 参数在这里做什么?没有提及其他 URL 模式。

标签: python django


【解决方案1】:

您可以将可选的GET 参数传递为:

reverse('products.views.info', kwargs={'prod': prod})+'?error=true&some_other_var=abc'

reverse 将解析后的 URL 作为字符串返回,因此您可以连接任意数量的 GET 参数。

【讨论】:

  • 对于其他使用它的人,这里有一些代码 - return HttpResponseRedirect('%s?%s' % (reverse('url-name', args=(args_in_url_pattern, )), '&amp;'.join(['%s=%s' % (key, value) for key, value in request.GET.items()]))) - 可能还应该对 url 进行转义?
【解决方案2】:

不是直接的答案,而是:为什么不直接使用消息框架 (https://docs.djangoproject.com/en/1.6/ref/contrib/messages/)。

【讨论】:

    【解决方案3】:

    尝试在 url 中使用可选组:

    # change (?P<error>\d+) to (?P<error>[a-zA-Z]+) to catch strings in error value
    url(r'^(?P<prod>\d+)(?:/(?P<error>\d+))?/', "products.views.info", name='info'),
    

    来源:Making a Regex Django URL Token Optional

    【讨论】:

      【解决方案4】:

      向视图函数添加参数不会使其成为 URL 模式,在您的情况下,您已将参数直接添加到视图方法,但未将其映射到 URL。

      因此,当您尝试反转 URL 时,找不到具有 error 的模式,这就是您收到错误的原因。

      你有两个选择:

      1. 制作我不推荐的pattern optional

      2. 将同一个视图映射到多个 URL,可选的一个 first 因为模式按照找到的顺序匹配:

        url(r'^(?P<prod>\d+)/(?P<error>\d+)/', "products.views.info", name='info-error'),
        url(r'^(?P<prod>\d+)/', "products.views.info", name='info'),
        

      现在,在你看来:

      from django.shortcuts import redirect
      
      def cartForm(request, prod):
          if request.method=="POST":
              quantity = request.POST.get('quantity', False)
              if quantity:
                  add_to_cart(request, prod, quantity)
                  return HttpResponseRedirect(reverse("cart"))
              #if no quantity indicated, display error message
              return redirect('info-error', prod=foo, error=True)
      

      这里我使用的是redirect shortcut

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-02
        • 2023-03-21
        • 2017-11-25
        • 2020-05-19
        • 1970-01-01
        • 2020-06-27
        • 1970-01-01
        • 2012-10-23
        相关资源
        最近更新 更多