[英]Django 1.6 class-based views: How to get the right path/to/view/ in url template tags
我在一個名為“事件”的應用程序中有兩個基於ListView的視圖。 一個是位於/ events /的“ events_index”,另一個是位於/ events / past /的“ past_events_index”。
直接導航到兩個URL即可加載所需的頁面。 我的問題是嘗試獲取{%url%}模板標記以正確鏈接到'past_events_index'。
apps / events / urls.py:
from django.conf.urls import patterns, url
from .views import EventDetailView, EventListView, PastEventListView
urlpatterns = patterns(
'apps.events.views',
url(r'^$', EventListView.as_view(), name='events_index'),
url(r'^past/$', PastEventListView.as_view(), name='past_events_index'),
url(r'^(?P<slug>[-\w]+)/$', EventDetailView.as_view(), name="events_show"),
)
apps / events / templates / events / index.html:
<a href="{% url 'events:past_events_index' %}">Past Events</a>
而不是將我指向/ events / past /,而是將我指向/ past /,這將產生404。這是用戶已經在/ events /的時候。
我想念什么? 是否在某處附加了斜杠?
為了完整起見,以下是我的觀點:
apps / events / views.py:
from .models import Event
from django.views.generic import ListView
from pure_pagination.mixins import PaginationMixin
from datetime import datetime
class EventListView(ListView):
date_today = datetime.now().date()
queryset = Event.objects.published().filter(is_feature=False).\
exclude(start_date__lte=date_today, end_date__isnull=True).\
exclude(start_date__lte=date_today, end_date__lte=date_today).\
exclude(start_date__isnull=True, end_date__lte=date_today)
template_name = "events/index.html"
def get_context_data(self, **kwargs):
date_today = datetime.now().date()
context = super(EventListView, self).get_context_data(**kwargs)
context['featured_event'] = Event.objects.published().filter(is_feature=True). \
exclude(start_date__lte=date_today, end_date__isnull=True). \
exclude(start_date__lte=date_today, end_date__lte=date_today). \
exclude(start_date__isnull=True, end_date__lte=date_today)
past_events = Event.objects.published().filter(is_feature=False).\
exclude(start_date__gte=date_today).\
exclude(start_date__isnull=True, end_date__gte=date_today)
context['past_events'] = past_events.count()
return context
class PastEventListView(PaginationMixin, ListView):
date_today = datetime.now().date()
queryset = Event.objects.published().filter(is_feature=False).\
exclude(start_date__gte=date_today).\
exclude(start_date__isnull=True, end_date__gte=date_today).\
reverse()
template_name = "events/index.html"
paginate_by = 10
def get_context_data(self, **kwargs):
context = super(PastEventListView, self).get_context_data(**kwargs)
context['is_past'] = True
return context
class EventDetailView(StatusDetailView):
model = Event
settings / urls.py:
from django.conf import settings
from django.conf.urls import include, patterns, url
from django.contrib import admin
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
from django.contrib.sitemaps.views import sitemap
from django.views.generic.base import RedirectView
from cms.sitemaps import CMSSitemap
from apps.news.sitemaps import NewsSitemap
admin.autodiscover()
sitemaps = {
'news': NewsSitemap,
'cmspages': CMSSitemap,
}
urlpatterns = patterns(
'',
url(r'^sitemap\.xml', sitemap, {'sitemaps': sitemaps}),
url(r'^garment/', include('apps.garment.urls')),
# Django Admin
(r"^%s/" % settings.ADMIN_NAMESPACE, include(admin.site.urls)),
url(r"^", include('cms.urls')),
# Urls from apps
url(r'^', include('apps.news.urls')),
url(r'^events/', include('apps.events.urls', namespace='events', app_name='events')),
)
if getattr(settings, "LOCAL_SERVE", False):
urlpatterns = patterns(
'django.views.static',
url(
r"^%s(?P<path>.*)$" % settings.MEDIA_URL.lstrip('/'),
"serve",
{
'document_root': settings.MEDIA_ROOT,
'show_indexes': True,
}),
) + staticfiles_urlpatterns() + urlpatterns
這可以通過命名空間解決。 (然后在覆蓋名稱空間的模型上刪除自定義url前綴字段。)感謝@CB
在主urls.py中命名事件url的名稱空間,然后使用'events:past_events_index'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.