【问题标题】:Generic Class based DetailView returns the same page基于泛型类的 DetailView 返回相同的页面
【发布时间】:2019-05-24 05:03:15
【问题描述】:

我正在构建一个相册应用程序。用户可以登录并创建类别并在这些类别中添加照片帖子。

当点击帖子链接时,它应该使用 DetailView 打开帖子,它只是通过帖子链接循环回到用户的帖子历史页面

我一直在尝试使用各种方法来过滤查询集并返回数据,但我不知道我哪里出错了。

posts/models.py:


    class Post(models.Model):
        user = models.ForeignKey(User, related_name='posts',on_delete=models.CASCADE)
        created_at = models.DateTimeField(auto_now=True)
        post_title = models.CharField( max_length=30)
        post_message = models.TextField()
        postimage = models.ImageField(upload_to='postimgs/',verbose_name=('post picture'))
        category = models.ForeignKey(Category, related_name='post_category', on_delete=models.CASCADE)

        def __str__(self):
            return self.post_title

        def save(self,*args,**kwargs):
            self.post_message_html = misaka.html(self.post_message)
            super().save(*args,**kwargs)

        def get_absolute_url(self):
            return reverse('posts:single', kwargs={"username":self.user.username,"pk":self.pk})


        class Meta:
            ordering = ['-created_at']
            unique_together = ['user','post_title']

posts/views.py:

    class PostDetail(SelectRelatedMixin, generic.DetailView):
        model =models.Post
        select_related = ('user', 'category')

        def get_queryset(self):
            queryset = super().get_queryset()
            return queryset.filter(user__username__iexact=self.kwargs.get('username'))


posts/urls.py:

    app_name = 'posts'

    urlpatterns = [
    url(r'^$',views.PostList.as_view(),name='all'),
    url(r'new/$',views.CreatePost.as_view(),name='create'),
    url(r'by/(?P<username>[-\w]+)',views.UserPosts.as_view(),name='for_user'),
    url(r'by/(?P<username>[-\w]+)/(?P<pk>\d+)/$',views.PostDetail.as_view(),name='single'),
    url(r'delete/(?P<pk>\d+)/$',views.DeletePost.as_view(),name='delete'),
    ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

HTML:

      <a href="{% url 'posts:for_user' username=post.user.username%}">@{{post.user.username}}</a>
        </span>
        <time class="time">
          <a href="{% url 'posts:single' username=post.user.username pk=post.pk %}">
            {{post.created_at}}
          </a>

点击 {{post.created_at}} 后应该会打开带有详细信息的帖子详细视图,但它在帖子列表页面中循环

【问题讨论】:

    标签: python django django-views


    【解决方案1】:

    您的查询集缺少comma(',')

    def get_queryset(self):
            queryset = super().get_queryset()
            return queryset.filter(user__username__iexact=self.kwargs.get('username'),category__categoryname__iexact=self.kwargs.get('categorynamee'))
    

    并更改您的网址并添加^infront

    url(r'^new/$',views.CreatePost.as_view(),name='create'),
    url(r'^by/(?P<username>[-\w]+)',views.UserPosts.as_view(),name='for_user'),
    url(r'^by/(?P<username>[-\w]+)/(?P<pk>\d+)/$',views.PostDetail.as_view(),name='single'),
    url(r'^delete/(?P<pk>\d+)/$',views.DeletePost.as_view(),name='delete'),
    

    【讨论】:

    • 感谢您指出这一点。尽管如此,问题仍然存在。
    • 您是否更改了 urls 文件?你能显示点击后重定向到的网址吗?
    • 那是因为 'for_user' 始终为真,无论有无第二个参数。
    • 我意识到我必须重新考虑流程和视图才能做出预期的行为。
    猜你喜欢
    • 2018-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多