django - 我如何在主页视图 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 %}
解决方案
解决方案一
由于您没有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 %}
推荐阅读
- node.js - Node/Express 生成日历 URL
- youtube - RSS feed for Youtube channels
- php - 对象在函数PHP中没有相同的属性
- search - 搜索引擎中的高效低基数与
- c# - Json.Net - 为单个属性调整字典键序列化
- java - Xpath 不使用 nbsp 检测文本
- azure - Azure:如何检索 validate-jwt 策略的颁发者签名密钥?
- java - 在 ProcessBuilder 中执行命令似乎不适用于 Windows (Kotlin) 中的“java”命令
- javascript - 如何冻结文本在 console.log 中的移动
- splunk - 在 Splunk 查询中对“最早”使用亚秒级精度