首页 > 解决方案 > 我如何在主页视图 www.mywebsite.com 中获得 pk

问题描述

我试图从这个函数中获取 pk,def home_view(request, pk):但是因为它在主视图www.site.com中返回错误home_view() missing 1 required positional argument: 'pk'所以它对我不起作用

我的问题是如何将 pk 传递给网站域中的模板,而无需像这样的任何额外网址

www.site.com

我的观点

def home_screen_view(request, pk, *args, **kwargs):
    post= Post.objects.filter(pk=pk) #here I want to get the pk
    comment = PostCommentIDF.objects.filter(post=post)

return render(request, 'personal/home.html', {'comment': comment)

我的网址

path('', home_screen_view, name='home'),

编辑

首先我使用 list [] 返回我的帖子,我需要帖子的 pk,因为评论模型与帖子模型是分开的,所以我使用 pk 在这个函数中使用

  posts = Post.objects.filter(pk=pk)
  comment = PostCommentIDF.objects.filter(post=post)



 post = []
  for u in users:
       p = Account.objects.get(username=u)
       posts = p.post_set.all()
       p_posts = p.video_set.all()
  post .append(p_posts)
  my_posts = request.user.post_set.all()
  post.append(my_posts)
  if len(post):
       post = sorted(chain(*post), reverse=True, key=lambda post: post.created_date)

我的评论 MPTT 模型

class PostCommentIDF(MPTTModel):

post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='pos_com')
parent = TreeForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name='post_children')
author = models.ForeignKey(Account, on_delete=models.CASCADE)
content = models.TextField()
created_date = models.DateTimeField(auto_now_add=True)

我的帖子模型

 class Post(models.Model):
 author = models.ForeignKey(Account, on_delete=models.CASCADE)
    article = models.TextField(null=True, blank=True)
    photo_article = models.ImageField(max_length=255, upload_to=get_poster_filepath)
    created_date = models.DateTimeField(auto_now_add=True)

我的与呈现评论相关的模板

   {% recursetree video.total_comts %}
    <div id="{{ node.id }}" class="my-2 p-2" style="border: 0px solid grey"> 
                    <div class="d-flex justify-content-between">
                      {{ node.publish|naturaltime }}           
            <div class="node-content mt-3">{{ node.content  }}</div>
                    </div>
{% endrecursetree %}

标签: djangodjango-modelsdjango-viewsdjango-formsdjango-templates

解决方案


解决方案一

由于您没有pk从 url 传递信息,因此您无法pk在视图中使用。所以将视图更改为:

def home_screen_view(request):
   #rest of the code

而不是pk,如果您想查看登录用户的帖子,您可以使用:

def home_screen_view(request):
    posts = Post.objects.filter(account__user=request.user)  # assuming there is a FK relation in Account model.

解决方案二

此外,您不能在/url 的主视图中任意找到 pk ,除非您像 一样传递它/12/,如果您传递该值,那么您需要更新 url 代码:

path('<int:pk>/', home_screen_view, name='home'),

解决方案三

您可以使用 url 查询字符串来获取主键:

def home_screen_view(request):
   pk = request.GET.get('pk', None)
   posts = Posts.objects.all()
   if pk:
      posts = posts.filter(pk=pk)

然后使用浏览器的 url 应该是这样的https://example.com/?pk=1

更新

如果您想发布特定评论,则可以使用以下解决方案:

# view
def home_screen_view(request):
   return render(request, 'personal/home.html', {'posts': Post.objects.filter(author__user=request.user)})

# template
{% for post in posts %}
    {% for comment in post.comment_set.all %}  // if you use related_name in PostCommentIDF then you need to use post.<related_name>.all
      {{ comment }}
    {% endfor %}
{% endfor %}

推荐阅读