2017-05-04 10 views
0

私はDjangoを初めて使用しており、サンプルプロジェクトを作成しています。私はGeneric 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' を示しています。コードで問題が見つかりません。私の押し付けられたURLは次のようになります。http://127.0.0.1:8000/personal/2/ここで、personalはアプリの名前であり、2はidとして扱われます。

答えて

1

問題は、get_context_dataメソッド内でself.kwargsの代わりにkwargsを使用していることです。 kwargsはコンテキストを補うためにメソッドに渡されたものであり、get_context_data方法で

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 

:それはのようなものでなければなりません。それらはself.kwargsと異なり、URLパターンのものです。

+0

私の質問ではわかりませんでした。私はこれを使用してプライマリキーをチェックすると、それはnullとしてpkを示して、これはなぜ私がpkとしてnoneを取得する問題です –

+1

私はあなたが私の答えを理解しているか分からない。あなたの質問のコードは異なります。あなたは 'kwargs'をチェックしています。 'self.kwargs'をチェックする必要があります。 – Alasdair

+1

'Story'(大文字)はクラスです。 'DetailView'(一般的にはPython)では、モデルインスタンスは' story'(小文字)です。 '{{story.writer}} 'を使うようにテンプレートを変更してください。 'get_context_data'をオーバーライドする場合は、私の答えにあるように' super() 'を呼び出すようにしてください。そうしないと、ビューが中断されます。最後に、Djangoの規約に合致するように 'detailView'の代わりに' DetailView'という名前のビューを指定する方が良いでしょう。 – Alasdair