【发布时间】:2019-11-09 13:41:12
【问题描述】:
我想使用带有标签的 django 过滤器显示相关帖子。 我写了这个过滤器,但是查询集不会用标题过滤。 也许有人可以给我一个提示,如何重写我的过滤器以显示与同一标签相关的所有帖子。
我在 app_tags.py 中的过滤器
@register.filter(name='related_posts')
def related_posts(tag):
posts = Post.objects.filter(tags__name__in = [tag])
return posts.title()
我的 HTML:
<div class="containernav">
<div class="mt-3 p-3 bg-white rounded box-shadow border border-gray">
<h6 class="border-bottom border-gray pb-2 mb-0">Verwandte Posts</h6>
<div class="media text-muted pt-3">
{% load app_tags %}
<a href="{% url 'post_detail' post.slug %}">{{ tag | related_posts }}</a>
</p>
</div>
</div>
</div>
我对posts.count 做了同样的事情,而且效果很好。但它不会显示具有相同标签的所有帖子的标题。 在上面的例子中,它说 Querset 没有属性“title”。
我也试过这个:
app_tags.py
@register.filter(name='related_posts')
def related_posts(self):
return Post.objects.filter(tags__in=self.tags.all())
HTML:
<div class="mt-3 p-3 bg-white rounded box-shadow border border-gray">
<h6 class="border-bottom border-gray pb-2 mb-0">Verwandte Posts</h6>
<div class="media text-muted pt-3">
{% load app_tags %}
{% for post in posts.related_posts %}
<a href="{% url 'post_detail' post.slug %}">{{ post.title }}</a>
</p>
{% endfor %}
</div>
</div>
models.py
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 = RichTextField(config_name='awesome_ckeditor')
created_on = models.DateTimeField(auto_now_add=True)
status = models.IntegerField(choices=STATUS, default=1)
tags = TaggableManager()
我的 app_tags.py
from blog.models import Post
from django import template
register = template.Library()
@register.filter(name='count_tags_usage')
def count_tags_usage(tag):
posts = Post.objects.filter(tags__name__in = [tag])
return posts.count()
@register.filter(name='related_posts')
def related_posts(tag):
posts = Post.objects.filter(tags__name__in = [tag])
# iterate over the QuerySet [posts]
for i in posts:
return i.title
我的新 Html 配置:
<div class="containernav">
<div class="mt-3 p-3 bg-white rounded box-shadow border border-gray">
<h6 class="border-bottom border-gray pb-2 mb-0">Verwandte Posts</h6>
<div class="media text-muted pt-3">
{% for tag in post.tags.all %}
{% load app_tags %}
<a href="{% url 'post_detail' post.slug %}">{{ tag | related_posts }}</a>
{% endfor %}
</p>
</div>
</div>
</div>
我的意见.py
from django.views import generic
from .models import Post
from django.shortcuts import render
from django.db.models import Q
from django.shortcuts import redirect
class PostList(generic.ListView):
model = Post
template_name = 'index.html'
paginate_by = 15
class PostDetail(generic.DetailView):
model = Post
template_name = 'post_detail.html'
def tag(request, slug):
posts = Post.objects.filter(tags__slug=slug)
return render(request, 'index.html', {"post_list": posts, "slug": tag})
def about(request):
return render(request, 'about.html', {})
##def verzeichnis(request):
##return render(request, 'verzeichnis.html', {})
def searchposts(request):
if request.method == 'GET':
query= request.GET.get('q')
submitbutton= request.GET.get('submit')
if len(query) == 0:
return redirect( 'https://www.code-reminder.com/')
if query is not None:
lookups= Q(title__icontains=query) | Q(content__icontains=query)
results= Post.objects.filter(lookups).distinct()
context={'results': results,
'submitbutton': submitbutton}
return render(request, 'search.html', context)
else:
return render(request, 'search.html')
else:
return render(request, 'search.html')
我的 urls.py
from . import views
from django.urls import path
from django.urls import include
from django.views.generic.base import RedirectView
urlpatterns = [
path('', views.PostList.as_view(), name='home'),
path('about', views.about, name='about'),
##path('verzeichnis', views.verzeichnis, name='verzeichnis'),
path('<slug:slug>/', views.PostDetail.as_view(), name='post_detail'),
path("tag/<slug:slug>/", views.tag, name='tag'),
【问题讨论】:
标签: python django tags filtering