61852


Mac, Python3, Djangoを利用して、ローカル環境でWEBアプリを開発しています。

URLを `http://127.0.0.1:8000/detail/1/`
としてDetailViewクラスを呼ぶと、下記のエラーが出ます。（データベースには[ID1]でデータがあることは確認しています。）

[code]

    Generic detail view DetailView must be called with either an object pk or a slug in the URLconf.
    
[/code]

どのように解決すれば良いか、教えていただけないでしょうか？

実行環境  
Mac: mojave 10.14.6  
Python: 3.7.5  
Django: 2.2.2

関係するコードは

urls.py

[code]

    from django.urls import path
    from . import views
    
    app_name = 'main'
    urlpatterns = [
        path('detail/<int:pk>/', views.DetailView.as_view(), name='detail'),
    ]
    
[/code]

views.py  
＊[pk_url_kwarg = 'id']とoverrideして変数名を[PK]から[id]としています。

[code]

    from django.contrib.auth.mixins import LoginRequiredMixin
    from django.views import generic
    from .models import Db
    
    class DetailView(LoginRequiredMixin, generic.DetailView):
    
      model = Db
      template_name = 'detail.html'
      pk_url_kwarg = 'id'
    
[/code]

**これまでに試した事**  
①[int:pk]の書き方を変える  
urls.py

[code]

    from django.urls import path
    from . import views
    
    urlpatterns = [
                #path('detail/<int:pk>/', views.DetailView.as_view(), name='detail'),
                #↓
                path('detail/(?P<pk>\d+)$/', views.DetailView.as_view(), name='detail'),
            ]
    
[/code]

結果

[code]

    Page not found (404)
    
[/code]

②overrideしないで、デフォルトのPKを使用  
views.py

[code]

    from django.contrib.auth.mixins import LoginRequiredMixin
    from django.views import generic
    from .models import Db
    
    class DetailView(LoginRequiredMixin, generic.DetailView):
    
            model = DbVegetableInfo
            template_name = 'detail.html'
            #↓
            # pk_url_kwarg = 'id'
    
[/code]

結果

[code]

    Reverse for 'detail' with no arguments not found. 1 pattern(s) tried: ['detail/(?P<pk>[0-9]+)/$']
    
[/code]

③[LoginRequiredMixin]を継承しない  
views.py

[code]

    from django.contrib.auth.mixins import LoginRequiredMixin
    from django.views import generic
    from .models import Db
    
    #class DetailView(LoginRequiredMixin, generic.DetailView):
    #↓
    class DetailView(generic.DetailView):
    
      model = Db
      template_name = 'detail.html'
      pk_url_kwarg = 'id'
    
[/code]

結果

[code]

    Generic detail view DetailView must be called with either an object pk or a slug in the URLconf.
    
[/code]


CC BY-SA 4.0
2019-12-27T17:21:47.747
61843
2019-12-28T09:31:43.590
2019-12-28T03:43:34.623
3060
36988
question
python python3 django
DetailViewクラスを呼ぶ時にURLにIDを渡すことができない


以下の方法で解決出来ましたので、紹介します。  
なお、DetailViewでoverrideして、idを利用する方法（↓）は、

[code]

    pk_url_kwarg = 'id'
    
[/code]

エラーが出て解決できなかったので、デフォルトのpkを使う方法で対応しました。

* * *

①urls.py,views.pyの設定  
urls.py

[code]

    urlpatterns = [
            path('detail/<int:pk>/', views.DetailView.as_view(), name='detail'),
        ]
    
[/code]

views.py  
idは使わず、デフォルトのpkを使用

[code]

    class DetailView(LoginRequiredMixin, generic.DetailView):
    
      model = Db
      template_name = 'detail.html'
    
[/code]

②hrefタグの調整  
この状態でサーバーを動かすと、エラーメッセージが以下のようになる

[code]

    Reverse for 'detail' with no arguments not found. 1 pattern(s) tried: ['detail/(?P<pk>[0-9]+)/$']
    
[/code]

DetailViewへ遷移する元となるListViewなどのhrefタグを調整して、detail/pk/に対応させる

[code]

    {% for list in object_list %}    
    <a href="{% url 'main:detail' list.pk %}">detail</a>
    {% endfor %} 
    
[/code]


CC BY-SA 4.0
2019-12-28T09:31:43.590
61852
2019-12-28T09:31:43.590
36988
61843
answer