【问题标题】:Python - retrieving slug value from foreignkey classPython - 从外键类中检索 slug 值
【发布时间】:2020-11-18 21:26:33
【问题描述】:

我是 Python 新手,我的代码需要一些帮助。甚至不确定我的标题是否有意义。

基本上我有我的博客,我正在尝试添加一个带有热门帖子的侧边栏。我创建了一个 PostStatistics 类来收集每个帖子中的访问次数,这可以从 Django 管理员中看到。

PostStatistics 类具有 Post 类的 ForeignKey。

好的,所以我的问题出在 PostDetail 视图中。我在那里有一个名为 Popular 的 QuerySet,我在其中检索了过去 7 天内最受欢迎的 5 个帖子。我在那里检索 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)})

类 PostStatistic(models.Model): 元类: db_table = "后统计"

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>

提前致谢!

【问题讨论】:

    标签: python django statistics django-queryset slug


    【解决方案1】:

    您需要在此查询的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>
    

    【讨论】:

    • 确实做到了!我想我之前尝试过,但我只尝试了 1 _ 而不是 2。
    猜你喜欢
    • 1970-01-01
    • 2019-10-14
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    • 2017-10-23
    • 2020-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多