Фильтр Django по первой букве модели

У меня есть проблема, и я не знаю, как ее решить. Я получил этот шаблон, генерирующий /list/a,b,c и т. д. И я хочу показать в этом URL-адресе a,b,c только модель с той же буквой.

шаблон списка

<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')

Как я могу отфильтровать это в другом желаемом шаблоне


person Rafalpero    schedule 07.02.2018    source источник
comment
вот так ‹a href=yourpath/{{i}} class=btn›{{i}}‹/a›, и вам нужно указать это в urls.py   -  person Anup Yadav    schedule 07.02.2018
comment
просто поясню: вы хотите отобразить список Anime объектов базы данных, отсортированных по алфавиту, верно?   -  person joppich    schedule 07.02.2018
comment
я хочу, чтобы после перехода, например, .../list/W отображались только объекты аниме, которые начинаются с буквы W   -  person Rafalpero    schedule 07.02.2018
comment
Возможно, связано, если я правильно понимаю.   -  person Lomtrur    schedule 07.02.2018


Ответы (3)


в вашем модуле тегов шаблона вы должны определить следующий простой тег:

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>
person adnanmuttaleb    schedule 07.02.2018

В вашем шаблоне выполните:

<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}
person Lomtrur    schedule 07.02.2018

Все еще не решил проблему после проверки этого разрешения. Я забыл показать, как выглядит мой 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)
person Rafalpero    schedule 07.02.2018
comment
просто примечание: если вы хотите уточнить свой вопрос, вы должны отредактировать его, не добавляя новый ответ. возвращаясь к вашему вопросу. string.ascii_uppercase возвращает все прописные буквы, вместо этого вы должны прочитать последнюю цель из объекта запроса, например. как строка запроса или другое. то вы должны отфильтровать аниме-объекты по отношению к последнему следующим образом: (title__startswith=latterReadFromRequest) - person adnanmuttaleb; 08.02.2018