Python - 从外键检索 slug 值 class
Python - retrieving slug value from foreignkey class
我是 Python 的新手,我的代码需要一些帮助。甚至不确定我的标题是否有意义。
基本上我有我的博客,我正在尝试添加一个带有流行 post 的侧边栏。我创建了一个 PostStatistics class 来收集每个 post 的访问次数,这可以从 Django admin 中看到。
Post统计信息 class 有一个指向 Post class 的外键。
好的,所以我的问题出在Post详细信息视图中。我在那里有一个名为 Popular 的 QuerySet,我在其中检索了过去 7 天内最流行的 5 个 post。我在那里检索了 Post_id 和 Post__Title。我还需要取回 Post SLUG,但我不知道该怎么做。
该 slug 将在以下代码中使用:
<a href="{% url 'post_detail' pop_article.post_slug %}">{{ pop_article.post__title }}</a>
以下是我的模型:
class Post(models.Model):
title = models.CharField(max_length=200, unique=True)
slug = models.SlugField(max_length=200, unique=True)
author = models.ForeignKey(
User, on_delete=models.CASCADE, related_name='blog_posts')
updated_on = models.DateTimeField(auto_now=True)
content = models.TextField()
created_on = models.DateTimeField(auto_now_add=True)
status = models.IntegerField(choices=STATUS, default=0)
views = models.PositiveIntegerField(default=0, editable=False)
class Meta:
ordering = ['-created_on']
db_table = "post"
def __str__(self):
return self.title
def get_absolute_url(self):
from django.urls import reverse
return reverse("post_detail", kwargs={"slug": str(self.slug)})
class Post统计(models.Model):
class元:
db_table = "Post统计"
post = models.ForeignKey(Post, on_delete=models.CASCADE)
date = models.DateField('Date', default=timezone.now)
views = models.IntegerField('Views', default=0)
def __str__(self):
return self.post.title
以下是我的看法:
def PostDetail(request, slug):
template_name = 'post_detail.html'
post = get_object_or_404(Post, slug=slug)
comments = post.comments.filter(active=True)
new_comment = None
context = {}
obj, created = PostStatistic.objects.get_or_create(
defaults={
"post": post,
"date": timezone.now()
},
# At the same time define a fence or statistics object creation
# by two fields: date and a foreign key to the article
date=timezone.now(), post=post
)
obj.views += 1
obj.save(update_fields=['views'])
# Now pick up the list of the last 5 most popular articles of the week
popular = PostStatistic.objects.filter(
# filter records in the last 7 days
date__range=[timezone.now() - timezone.timedelta(7), timezone.now()]
).values(
'post_id', 'post__title'
).annotate(
views=Sum('views')
).order_by(
# sort the records Descending
'-views')[:5] # Take 5 last records
# Comment posted
if request.method == 'POST':
comment_form = CommentForm(data=request.POST)
if comment_form.is_valid():
# Create Comment object but don't save to database yet
new_comment = comment_form.save(commit=False)
# Assign the current post to the comment
new_comment.post = post
# Save the comment to the database
new_comment.save()
else:
comment_form = CommentForm()
return render(request, template_name, {'post': post,
'comments': comments,
'new_comment': new_comment,
'comment_form': comment_form,
'popular_list': popular
},)
以下是我的HTML:
<div class="card-body">
{% if popular_list %}
<p class="card-text">
{% for pop_article in popular_list %}
<a href="{% url 'post_detail' pop_article.post_slug %}">{{ pop_article.post__title }}</a>
<br>
{% endfor %}
</p>
{% endif %}
</div>
提前致谢!
你需要在这个查询的 values
中添加 post__slug
像这样的视图函数
popular = PostStatistic.objects.filter(
# filter records in the last 7 days
date__range=[timezone.now() - timezone.timedelta(7), timezone.now()]
).values(
'post_id','post__slug' ,'post__title'
).annotate(
views=Sum('views')
).order_by(
# sort the records Descending
'-views')[:5]
那么您就可以在模板中这样做
<a href="{% url 'post_detail' pop_article.post__slug %}">{{ pop_article.post__title }}</a>
我是 Python 的新手,我的代码需要一些帮助。甚至不确定我的标题是否有意义。
基本上我有我的博客,我正在尝试添加一个带有流行 post 的侧边栏。我创建了一个 PostStatistics class 来收集每个 post 的访问次数,这可以从 Django admin 中看到。
Post统计信息 class 有一个指向 Post class 的外键。
好的,所以我的问题出在Post详细信息视图中。我在那里有一个名为 Popular 的 QuerySet,我在其中检索了过去 7 天内最流行的 5 个 post。我在那里检索了 Post_id 和 Post__Title。我还需要取回 Post SLUG,但我不知道该怎么做。
该 slug 将在以下代码中使用:
<a href="{% url 'post_detail' pop_article.post_slug %}">{{ pop_article.post__title }}</a>
以下是我的模型:
class Post(models.Model):
title = models.CharField(max_length=200, unique=True)
slug = models.SlugField(max_length=200, unique=True)
author = models.ForeignKey(
User, on_delete=models.CASCADE, related_name='blog_posts')
updated_on = models.DateTimeField(auto_now=True)
content = models.TextField()
created_on = models.DateTimeField(auto_now_add=True)
status = models.IntegerField(choices=STATUS, default=0)
views = models.PositiveIntegerField(default=0, editable=False)
class Meta:
ordering = ['-created_on']
db_table = "post"
def __str__(self):
return self.title
def get_absolute_url(self):
from django.urls import reverse
return reverse("post_detail", kwargs={"slug": str(self.slug)})
class Post统计(models.Model): class元: db_table = "Post统计"
post = models.ForeignKey(Post, on_delete=models.CASCADE)
date = models.DateField('Date', default=timezone.now)
views = models.IntegerField('Views', default=0)
def __str__(self):
return self.post.title
以下是我的看法:
def PostDetail(request, slug):
template_name = 'post_detail.html'
post = get_object_or_404(Post, slug=slug)
comments = post.comments.filter(active=True)
new_comment = None
context = {}
obj, created = PostStatistic.objects.get_or_create(
defaults={
"post": post,
"date": timezone.now()
},
# At the same time define a fence or statistics object creation
# by two fields: date and a foreign key to the article
date=timezone.now(), post=post
)
obj.views += 1
obj.save(update_fields=['views'])
# Now pick up the list of the last 5 most popular articles of the week
popular = PostStatistic.objects.filter(
# filter records in the last 7 days
date__range=[timezone.now() - timezone.timedelta(7), timezone.now()]
).values(
'post_id', 'post__title'
).annotate(
views=Sum('views')
).order_by(
# sort the records Descending
'-views')[:5] # Take 5 last records
# Comment posted
if request.method == 'POST':
comment_form = CommentForm(data=request.POST)
if comment_form.is_valid():
# Create Comment object but don't save to database yet
new_comment = comment_form.save(commit=False)
# Assign the current post to the comment
new_comment.post = post
# Save the comment to the database
new_comment.save()
else:
comment_form = CommentForm()
return render(request, template_name, {'post': post,
'comments': comments,
'new_comment': new_comment,
'comment_form': comment_form,
'popular_list': popular
},)
以下是我的HTML:
<div class="card-body">
{% if popular_list %}
<p class="card-text">
{% for pop_article in popular_list %}
<a href="{% url 'post_detail' pop_article.post_slug %}">{{ pop_article.post__title }}</a>
<br>
{% endfor %}
</p>
{% endif %}
</div>
提前致谢!
你需要在这个查询的 values
中添加 post__slug
像这样的视图函数
popular = PostStatistic.objects.filter(
# filter records in the last 7 days
date__range=[timezone.now() - timezone.timedelta(7), timezone.now()]
).values(
'post_id','post__slug' ,'post__title'
).annotate(
views=Sum('views')
).order_by(
# sort the records Descending
'-views')[:5]
那么您就可以在模板中这样做
<a href="{% url 'post_detail' pop_article.post__slug %}">{{ pop_article.post__title }}</a>