2017-07-18 57 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