2017-07-18 86 views
0

我得到一个错误NoReverseMatch当我尝试从一个视图到另一个传递两个参数。这是通过参数的观点:无法修复的Django NoReverseMatch错误

# promotion/views.py 
def enter_promo_code(request, template): 
    if request.method == "POST": 
     form = PromotionCodeForm(request.POST) 
     if form.is_valid(): 
      message_text, expiry_date = process_valid_promo_code(request.user, form.cleaned_data['promo_code']) 
      return HttpResponseRedirect(reverse('welcome-page-promo', \ 
        kwargs={'message_text': message_text, 'expiry_date': expiry_date})) 
    else: 
     form = PromotionCodeForm(label_suffix="") 
    context = {'form': form} 
    return render(request, template, context) 

这是接收视图。请注意,两个输入参数是可选的。 urlpatterns显示可以使用或不使用参数来调用此视图。

# home/views.py 
def welcome_page(request, template, message_text=None, expiry_date=None): 
    account = Account.objects.get(pk=request.user.id) 
    context = {'uid': request.user.id, 'account_type': account.type.account_type_cd, 'message_text': message_text, 'expiry_date': expiry_date} 
    return render(request, template, context) 

这里是接收视图的URL模式:

# home/urls.py 
url(r'^welcome/$', 
    'home.views.welcome_page', 
    {'template': 'welcome_page.html'}, 
    name='welcome-page'), 

url(r'^welcome/(?P<message_text>\w{1,})/(?P<expiry_date>\w{1,})/$', 
    'home.views.welcome_page', 
    {'template': 'welcome_page.html'}, 
    name='welcome-page-promo'), 

当我执行的推广来看,我得到这个错误返回HttpResponseRedirect命令执行时:

NoReverseMatch at /promotion/code/ 
Reverse for 'welcome-page-promo' with arguments '()' and keyword arguments '{'message_text': u'Your promotion code was approved! You will receive a one-year free trial membership which expires on ', 'expiry_date': 'Jul. 18, 2018'}' not found. 1 pattern(s) tried: ['welcome/(?P<message_text>\\w{1,})/(?P<expiry_date>\\w{1,})/$'] 

我m在项目中的不同应用程序中运行相同的代码模式,并且运行时没有错误。任何人都可以看到我做错了什么?

+0

为什么你在url完整的消息文本? – Sayse

+1

是的,现在我看着它,我想做的事很愚蠢。 – William

回答

0

您这里有两个问题,设计一个与实施中的一个。

设计的问题是,你可能不应该在你的网址,这么长的文字。我相信Django会处理为你逃避的论点,但它仍然不是最简单的模式。在我看来,你的论点很可能是静态的,或者至少从少数几种可能性中选择。很可能你应该将它记录在模板中,为它创建一个模型并传递ID,或者沿着这些线传递。这没有什么错各地传递日期的URI的,虽然我更喜欢像2018-07-18Jul. 18, 2018一个简单的格式,但如果它是真的,你可能想为会员的模型,并将其设置为一个属性有一个截止日期,然后看看它它是您的欢迎页面视图。

把那一边,看着你的执行的问题 - 你的观点正则表达式只能从\w类,它被定义为匹配一个或多个字符:

如果未指定区域设置和UNICODE标志,匹配任何字母数字字符和下划线;这相当于设置[a-zA-Z0-9_]。使用LOCALE,它将匹配[0-9_]集合以及当前语言环境定义为字母数字的任何字符。如果设置了UNICODE,它将匹配字符[0-9_]以及Unicode字符属性数据库中分类为字母数字的任何字符。

但是,您的参数包括字符如!和空格。使用符合你想要的参数的正则表达式 - [^/]+是一个,如果你想要宽容。 (+比在我看来{1,}更具可读性,但他们的意思是一样的。)

+0

谢谢。如果有的话,我还没有弄明白这一点。但正如Sayse在上面提到的那样,我首先想要做什么愚蠢的事情。这不是我引以为荣的问题。 – William