【问题标题】:Django filter by first letter of modelDjango按模型的第一个字母过滤
【发布时间】:2018-02-07 11:05:52
【问题描述】:

我有一个问题,我不知道如何解决它。我得到了这个模板生成 /list/a,b,c 等。我想在这个 a,b,c url 模型中显示相同的字母。

列表模板

<div class="panel-body anime-list text-center">
    <div class="btn-group btn-group-xs">
        {% for i in alphabet %}
            <a href="{{i}}" class="btn">{{i}}</a>
        {%endfor%}
    </div>
</div>

模特的

class Anime(models.Model):
    title = models.CharField(max_length=300, unique=True)
    ongoing = models.BooleanField(default=True)
    add_date = models.DateTimeField('date published')

如何在另一个想要的模板中过滤它

【问题讨论】:

  • 像这样 {{i}} 你需要在 urls.py 中提及这一点跨度>
  • 澄清一下:您想显示Anime 数据库对象的列表,按字母顺序排序,对吗?
  • 我想在例如 .../list/W 之后只显示以 W 字母开头的动漫对象
  • Possibly related 如果我理解正确的话。

标签: python django


【解决方案1】:

在您的模板标签模块中,您应该定义以下简单标签:

from django import template

register = template.Library()

@register.simple_tag
def filterAnime(char):
    return Anime.objects.filter(title__startswith=char)

那么你可以在你的模板中使用这个标签,如下所示:

{% load my_tags %}
<div class="panel-body anime-list text-center">
    <div class="btn-group btn-group-xs">
        {% for i in alphabet %}
            <a href="{{i}}" class="btn">{{i}}</a>
            {%filterAnime i as filterdObjs%}
            //do what ever you want
        {%endfor%}
    </div>
</div>

【讨论】:

    【解决方案2】:

    在你的模板中做:

    <a href="{% url 'list_view' letter=i %}" class="btn">{{i}}</a>
    

    目标是让字母进入视图,在此通过将其作为 URL 参数来完成。

    在你的urls.py

    url(r'^list/(?P<letter>[a-z])$', list_view, name="list_view"),
    

    你的看法:

    def list_view(request, letter=None):
      matches = Anime.objects.all().order_by("title").filter(Q(title__startswith=letter)|Q(title__startswith=letter.upper()))
      return render(request, "your_app/your_template.html", {"matches": matches}
    

    【讨论】:

      【解决方案3】:

      检查此解决方案后仍然没有解决问题。我忘了展示我的 views.py 的样子,我认为 ascii_uppercase 是个问题,是真的吗?

      from django.shortcuts import render
      import string
      from home.models import Anime
      
      
      alphabet = string.ascii_uppercase
      
      
      def list(request):
          context = {'alphabet': alphabet}
          return render(request, 'list/list.html', context)
      
      
      def list_detail(request):
          anime = Anime.objects.all().filter(title__startswith=alphabet)
          context = {'anime': anime}
          return render(request, 'list/detail.html', context)
      

      【讨论】:

      • 只是一个通知:如果你想澄清你的问题,你应该编辑它而不是添加新的答案。回到你的问题。 string.ascii_uppercase 返回全部大写,而不是您应该从请求对象中读取目标后者,例如作为查询字符串或其他。那么您应该按如下方式针对后者过滤动漫对象: (title__startswith=latterReadFromRequest)
      猜你喜欢
      • 2011-03-22
      • 2012-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多