2013-07-12 55 views
1

使用下面的Django代碼時,在將url關鍵字傳遞給模板時出現問題。Django的URL關鍵字

views.py

def index(request,username): 
    return render(request,'myaccount.html') 

從項目名稱的文件夾urls.py從我的帳戶應用

urlpatterns = patterns('', 
    url(r'^(?P<username>[a-zA-Z0-9]+)/$','myaccount.views.index',name='myaccount'), 
) 

的問題是,

urlpatterns = patterns('', 
    url(r'^myaccount/',include('myaccount.urls')), 
) 

urls.py爲什麼當我用下面的它顯示的HTML代碼/myaccount/Jerry/

myaccount.html 

    {% url 'myaccount' 'Jerry' %} 

但它顯示錯誤當我通過關鍵字?

myaccount.html 

    {% url 'myaccount' username %} 

NoReverseMatch at /myaccount/Jerry/ 
Reverse for 'myaccount' with arguments '('',)' and keyword arguments '{}' not found. 

當我通過變量名這樣的錯誤得到修正:

def index(request,username): 
    return render(request,'myaccount.html',{'username':username}) 

但是,有沒有更快的方法?

+0

你會用更快的方式來闡述你的意思嗎?這是經過驗證的內容還是用戶名是別的? –

+0

@PaulRenton這是關於在包含'?P '的任何URL中獲取一個名爲'用戶名'的變種。它不需要登錄。 – zurfyx

+0

好吧讓我知道如果我的修改答案是你正在尋找的 –

回答

1

在您的正則表達式中,您正在捕獲一個鍵/值對,其中鍵等於用戶名。您需要在url標記中指定username ='Jerry'。

P < username>表示捕獲以下內容並將其關聯到名爲username的關鍵字。

{% url 'myaccount' username='Jerry' %} 

所以你的情況,如果你不提供反向查找關鍵字參數,它會尋找那些不存在的正則表達式。

編輯

這可能會解決你的'更快的方法的關注。您應該嘗試使用基於類的視圖。見https://docs.djangoproject.com/en/1.5/ref/class-based-views/base/#django.views.generic.base.TemplateView

如果一個人使用url圖案 - >

url(r'^(?P<somenumber>\d+)/test/$', views.TestView.as_view(), name='testview') 

凡TestView在views.py被定義爲(一定要導入您的url.py意見)

from django.views.generic import TemplateView 
class TestView(TemplateView): 
    model = xxxx // link to your model here 
    template_name = 'test.html' 

在test.html模板中,您只需要執行此操作

{{ somenumber }} 

要提取傳入的值論據。

TemplateView的get_context_data(self,** kwargs)函數將自動更新模板的上下文以包含在您的url模式中找到的任何鍵/值對參數。

事實上,您可以重寫此函數並調用super來更新模板上下文中所需的任何自定義k/w參數。

+0

我希望這個過程自動。我需要通過'render(request,'。html',{'username':username}''傳遞變量用戶名嗎?或者還有其他更快的方法嗎? – zurfyx

+0

您可以使用基於類的視圖並更新上下文** kwargs與用戶名。如果您定義了用戶名變量,這應該防止用戶名的硬編碼。 –

+0

Jerry,請查看此鏈接以查看CBV TemplateView https://docs.djangoproject.com/en/1.5/ref/class -based-views/base /#django.views.generic.base.TemplateView。** kwargs合併傳遞給鍵/字參數。您可以使用它們更新模板的上下文。 –