【问题标题】:Generic detail view PostDetailView must be called with either an object pk or a slug in the URLconf通用详细视图 PostDetailView 必须在 URLconf 中使用对象 pk 或 slug 调用
【发布时间】:2019-08-22 17:27:53
【问题描述】:

我在我的模型中使用了 get_absolute_url 但是当我浏览我的帖子链接时,我得到了这个类型错误 /blog/details/Hello-World1/ 处的 AttributeError 通用详细视图 PostDetailView 必须在 URLconf 中使用对象 pk 或 slug 调用。

我想创建链接这个链接/Hello-World1/(与标题和pk id混合)

模型.py


class Post(models.Model):
    author = models.ForeignKey(settings.AUTH_USER_MODEL, models.SET_NULL, null=True, blank=True,)
    title = models.CharField(max_length=200)
    content = models.TextField()
    tags = models.ManyToManyField(Tag)
    created_at=models.DateTimeField(auto_now_add=True)
    updated_at=models.DateTimeField(auto_now=True)


    def get_absolute_url(self):
        title = self.title.replace(" ", "-")
        return  reverse('blog:post_details', args=[title+str(self.id)])





views.py


class PostDetailView(DetailView):
    model = Post
    template_name = 'blogs/blog_details.html'

urls.py

path('details/<str:new_str>/', PostDetailView.as_view(), name="post_details"),

【问题讨论】:

    标签: python django django-models django-views


    【解决方案1】:

    你需要重写get_object

    view.py

    class PostDetailView(DetailView):
        model = Post
        template_name = 'blogs/blog_details.html'
        
        def get_object(self, queryset=None):
            if queryset is None:
                queryset = self.get_queryset()
            new_str = self.kwargs.get('new_str') or self.request.GET.get('new_str') or None
    
            queryset = queryset.filter(pk=new_str)
            obj = queryset.get()
            return obj
    

    http://www.chenxm.cc/article/1143.html

    【讨论】:

      【解决方案2】:

      您的网址应该有 pk arg 而不是 new_str

      path('details/<int:pk>/', PostDetailView.as_view(), name="post_details"),
      

      【讨论】:

      • 我现在在 /blog/ Reverse for 'post_details' 遇到此错误 NoReverseMatch,但未找到参数 '('hello-world1',)'。尝试了 1 种模式:['blog/details/(?P[0-9]+)/$']
      • 将此reverse('blog:post_details', args=[title+str(self.id)]) 更改为reverse('blog:post_details', args=(self.pk,))
      • 实际上,我想创建类似 /hello-world2/ 的链接(与 pk id 的标题混合)
      • 您需要的是一个 slug 字段,请在您的 django 模型中定义一个 slug 字段并在 url 中使用它,例如 &lt;slug:slug&gt;。有关 slug 字段的更多信息,请阅读here
      【解决方案3】:

      view.py

      class PostDetailView(DetailView):
          model = Post
          template_name = 'blogs/blog_details.html'
          
          def get_object(self, queryset=None):
              if queryset is None:
                  queryset = self.get_queryset()
              new_str = self.kwargs.get('new_str') or self.request.GET.get('new_str') or None
      
              queryset = queryset.filter(pk=new_str)
              obj = queryset.get()
              return obj
      
      see http://www.chenxm.cc/article/1143.html
      

      【讨论】:

        猜你喜欢
        • 2021-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-07
        • 2014-06-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多