2017-05-04 79 views
0

我是Django的新手,並且一直在製作示例項目。我一直在嘗試使用通用的Detailview。看來,URL重定向工作正常,但DetailView無法從URL獲取主鍵。Django URL映射問題/ DetailView

主要url.py:

urlpatterns = [ 
url(r'^admin/', admin.site.urls), 
url(r'^',include('personal.urls')), 
] 

這裏是我的應用程序的urls.py代碼:爲的DetailView

urlpatterns = [ 
url(r'(?P<pk>\d+)/$',views.detailView.as_view(),name="detail"),] 

查看文件:

from django.shortcuts import render 
from django.views import generic 
from .models import Story 


class detailView(generic.DetailView): 
    model = Story 
    template_name = 'personal/storydetail.html' 

    def get_context_data(self, **kwargs): 
     pk = kwargs.get('pk') # this is the primary key from your URL 
     print("PK:",pk) 

模板代碼:

{% block content %} 
{{ Story.writer }} 
<h6> on {{ Story.story_title }}</h6> 
<div class = "container"> 
    {{ Story.collection }} 
</div> 
{% endblock %} 

故事類代碼:

class Story(models.Model): 
    story_title = models.CharField(max_length=200) #Story title 
    writer = models.CharField(max_length=200) #WriterName 
    collection=models.CharField(max_length=200) #Collection/Book name 

當我在視圖檢查主鍵值它表明它 'NONE'。我找不到代碼的問題。我的網址如下所示:http://127.0.0.1:8000/personal/2/其中personal是應用程序的名稱,2應被視爲id。

回答

1

問題是您在get_context_data方法內使用kwargs而不是self.kwargs。它應該是這樣的:

def get_context_data(self, **kwargs): 
    # You need to call super() here, so that the context from the DetailView is included 
    kwargs = super(detailView, self).get_context_data(**kwargs) 

    pk = self.kwargs['pk'] # No need for get() here -- if you get a KeyError then you have a problem in your URL config that should be fixe # this is the primary key from your URL 

    # edit kwargs as necessary 
    ... 
    return kwargs 

get_context_data方法,kwargs是那些傳遞給彌補上下文的方法。它們與self.kwargs不同,它們來自url模式。

+0

我的問題似乎沒有明確。當我使用它檢查主鍵時,它顯示pk爲空,這就是爲什麼我沒有得到任何pk的問題 –

+1

我不確定你是否理解我的答案。你問題中的代碼是不同的。你正在檢查'kwargs'。你需要檢查'self.kwargs'。 – Alasdair

+1

'Story'(大寫)是班級。在'DetailView'(和一般的Python)中,模型實例是'story'(小寫)。改變你的模板使用'{{story.writer}}'等等。如果你重寫'get_context_data',確保你調用'super()',就像我在我的答案中一樣,否則你會打破視圖。最後,最好將您的視圖命名爲'DetailView'而不是'detailView'以匹配Django約定。 – Alasdair