django-taggit:名称与slug查找问题

时间:2018-06-15 22:04:24

标签: python django django-queryset django-taggit

我使用django-taggit的TaggableManager()获得了一个带有genres字段的Concert对象。

我有一个类型索引页面,列出了所有类型和链接:

genres.html:

{% extends 'base.html' %}

{% block content %}
  <h1>Genres</h1>
  {% for genre in genres %}
  <ul class="genres">
    <a href="{% url 'concerts:genre_filter' genre=genre.slug %}">
      <li>
        {{ genre }}
      </li>
    </a>
  </ul>
  {% endfor %}

{% endblock %}

每个类型链接到一个新视图,该视图应显示标记有该特定类型的所有音乐会。

calendar.html标题:

  {% elif request.resolver_match.url_name == "genre_filter" %}
  <h1>Upcoming Events: <em>{{ genre }}</em></h1>
  <p class="center">
    <a href = "{% url 'concerts:genre_filter_past' genre=genre %}">
      Click here to see past events under genre <em>{{ genre }}</em>
    </a>
  </p>
  {% elif request.resolver_match.url_name == "genre_filter_past" %}
  <h1>Past Events with <em>{{ genre }}</em> Tag</h1>
  <p class="center">
    <a href = "{% url 'concerts:genre_filter' genre=genre %}">
      Click here to see upcoming events under genre <em>{{ genre }}</em>
    </a>
  </p>
  {% endif %}

以下是所有这些观点:

def genre_filter(request, genre):
    now = datetime.datetime.now()
    concerts = Concert.objects.filter(genres__name__in=[genre])\
                              .filter(date__gte=now).order_by('date')
    return render(request, 'concerts/calendar.html', {'concerts': concerts,
                                                      'genre': genre})

def genre_filter_past(request, genre):
    now = datetime.datetime.now()
    concerts = Concert.objects.filter(genres__name__in=[genre])\
                              .filter(date__lt=now).order_by('-date')
    return render(request, 'concerts/calendar.html', {'concerts': concerts,
                                                      'genre': genre})

def genre_index(request):
    genres = Tag.objects.all().order_by('name')
    template = 'concerts/genres.html'
    return render(request, template, {'genres': genres})

以下是urls.py:

url(r'^genre/(?P<genre>[\w-]+)/$', views.genre_filter, name="genre_filter"),
url(r'^genre/past/(?P<genre>[\w-]+)/$', views.genre_filter_past,
    name="genre_filter_past"),
url(r'^genres/index/$', views.genre_index, name="genre_index"),

我的问题来自于我的类型与其slug不匹配,主要是当它是一个两个单词的类型时。例如,流派“世界音乐”正在过滤“世界音乐”并返回零结果。

我一直试图将事情转移很长时间,而且它开始让我发疯。如果我尝试传递类型名称而不是slug(在genres.html中说genre=genre而不是genre=genre.slug,我会发现NoReverseMatch查找错误。如果我尝试更改urls.py采取了slug而不是类型,它搞砸了我所有的其他代码,即使我试图调整它。

我已经五次尝试并重写了这个,试图弄清楚我做错了什么。我真的在这里撕扯我的头发。我很感激任何建议。

0 个答案:

没有答案