Django根据标签过滤博客 [英] Django Filtering A Blog Based on Tags

查看:47
本文介绍了Django根据标签过滤博客的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试根据标签过滤我的博客.我设法弄清楚了如何显示所有标签,但是现在我希望用户能够单击标签并根据该标签显示博客文章的过滤器列表.

I'm trying to filter my blog based on tags. I've managed to work out how to display all the tags, however now I want the user to have the ability to click on a tag and bring up a filter list of blog posts based on that tag.

我遇到错误:

ValueError invalid literal for int() with base 10: 'testtag'

url.py

urlpatterns = [
    # Examples: /blogs
    url(r'^tags$', 'blog.views.tags', name='tags'),
    url(r'^tags/(?P<blog_tagslug>[\w-]+)$', 'blog.views.tagslist', name='tagslist'), 

views.py

def tags(request):
    blog_obj = Tag.objects.all()
    paginator = Paginator(blog_obj, 5)

    page = request.GET.get('page')

    try:
        blog_list = paginator.page(page)
    except PageNotAnInteger:
        # If page is not an integer, deliver first page.
        blog_list = paginator.page(1)
    except EmptyPage:
        # If page is out of range (e.g. 9999), deliver last page of results.
        blog_list = paginator.page(paginator.num_pages)

    template_hash = {'blog_list':blog_list}
    return render(request,'blog/tags.html', template_hash)

def tagslist(request, blog_tagslug):
    #blog = Blog.objects.get(pk=blog_id)
    #blog = Tag.objects.all().filter(tagslug=blog_tagslug)
    blog = Blog.objects.all().filter(tags=blog_tagslug)

    paginator = Paginator(blog, 2)

    page = request.GET.get('page')

    try:
        blog_list = paginator.page(page)
    except PageNotAnInteger:
        # If page is not an integer, deliver first page.
        blog_list = paginator.page(1)
    except EmptyPage:
        # If page is out of range (e.g. 9999), deliver last page of results.
        blog_list = paginator.page(paginator.num_pages)

    template_hash = {'blog_list':blog_list}
    return render(request,'blog/index.html', template_hash)

tags.html(工作正常)

tags.html (works fine)

<h1>All Tags</h1>
{% if blog_list %}
    <ul>
    {% for blog in blog_list %}
        {{ blog.image.thumbnail.url }}

        <li><a href="{% url "tagslist" blog.tagslug %}">{{ blog.tagslug }}</a></li>
        {{ blog.tags.all|join:", " }} <br>
    {% endfor %}
    </ul>
{% else %}
    <p>No blogs are available.</p>
{% endif %}

<div class="pagination">
    <span class="step-links">
        {% if blog_list.has_previous %}
            <a href="?page={{ blog_list.previous_page_number }}">previous</a>
        {% endif %}

        <span class="current">
            Page {{ blog_list.number }} of {{ blog_list.paginator.num_pages }}.
        </span>

        {% if blog_list.has_next %}
            <a href="?page={{ blog_list.next_page_number }}">next</a>
        {% endif %}
    </span>
</div>   

tagslist.html(不起作用会出现错误)

tagslist.html (doesn't work gets error)

<h1>Blog Index</h1>
{% if blog_list %}
    <ul>
    {% for blog in blog_list %}
        {{ blog.image.thumbnail.url }}

        <li><a href="{% url "show" blog.id blog.slug %}">{{ blog.blog_title }}</a></li>
        {{ blog.tags.all|join:", " }} <br>
    {% endfor %}
    </ul>
{% else %}
    <p>No blogs are available.</p>
{% endif %}

<div class="pagination">
    <span class="step-links">
        {% if blog_list.has_previous %}
            <a href="?page={{ blog_list.previous_page_number }}">previous</a>
        {% endif %}

        <span class="current">
            Page {{ blog_list.number }} of {{ blog_list.paginator.num_pages }}.
        </span>

        {% if blog_list.has_next %}
            <a href="?page={{ blog_list.next_page_number }}">next</a>
        {% endif %}
    </span>
</div>

models.py

models.py

from django.db import models
from django.contrib.auth.models import User
from django.core.urlresolvers import reverse
from django.conf import settings

# Create your models here.

class Image(models.Model):
     name = models.CharField(max_length = 255)
     image = models.ImageField(upload_to="%Y/%m/%d",max_length=500,blank=True,null=True)
     thumbnail = models.ImageField(upload_to="%Y/%m/%d",max_length=500,blank=True,null=True)

     def __str__(self):
        return self.name


class Tag(models.Model):
    tagslug = models.SlugField(max_length=200, unique=True)

    def __str__(self):
        return self.tagslug

class Author(models.Model):
    authorname = models.CharField(max_length=200, null=True)

    def __str__(self):
        return self.authorname


class Blog(models.Model):
    blog_title = models.CharField(max_length = 200)
    author = models.ForeignKey(Author)
    image = models.ForeignKey(Image)    
    blog_content = models.TextField()
    slug = models.SlugField(max_length=200, unique=True)
    publish = models.BooleanField(default=True)
    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True)
    tags = models.ManyToManyField(Tag)
    user_id = models.ForeignKey(User)

    def __str__(self):
        return self.blog_title

class Comment(models.Model):
    comment_content = models.TextField()
    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True)  
    blog_id = models.ForeignKey(Blog)
    user_id = models.ForeignKey(User)

    def __str__(self):
        return '{0}, {1}'.format(self.comment_content, self.created)

推荐答案

问题在于,当您传递字符串时,标签期望包含 Tag 对象的列表.您应该按标记的标签过滤博客,如下所示:

The problem is that tags expect a list of Tag objects whereas you pass a string. You should filter blogs by tag's slug as follows:

blog = Blog.objects.all().filter(tags__tagslug=blog_tagslug)

这篇关于Django根据标签过滤博客的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆