【问题标题】:Django 1.6 class-based views: How to get the right path/to/view/ in url template tagsDjango 1.6 基于类的视图:如何在 url 模板标签中获取正确的路径/到/视图/
【发布时间】:2015-04-29 15:20:16
【问题描述】:

我在一个名为“事件”的应用程序中有两个基于 ListView 的视图。一个是位于 /events/ 的“events_index”,另一个是位于 /events/past/ 的“past_events_index”。

直接导航到两个 url 会加载所需的页面 a-OK。我的问题是试图让 {% url %} 模板标签正确链接到“past_events_index”。

应用程序/事件/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

【问题讨论】:

  • 在您的主要urls.py 中命名您的活动网址,然后使用'events:past_events_index'
  • 刚刚尝试了命名空间,我的链接仍然指向 /past/。我将模板标签更改为 {% url 'events:past_events_index' %} ,现在我在 settings/urls.py 中得到了这个:'code' urlpatterns = patterns('code' '', 'code' 'code' 'code' 'code' url(r'^', include('apps.events.urls', namespace='events', app_name='events')), 'code' ) ?
  • 粘贴问题。再试一次:刚刚尝试了命名空间,我的链接仍然指向 /past/。我将模板标签更改为 {% url 'events:past_events_index' %},现在我在 settings/urls.py 中得到了这个:[link] pastebin.com/dBsPSWZy
  • 请显示主 urls.py。
  • 上面添加了 settings/urls.py 并编辑了模板标签以使用事件命名空间。到目前为止结果相同。

标签: python django


【解决方案1】:

这已通过命名空间解决。 (然后删除覆盖命名空间的模型上的自定义 url 前缀字段。)感谢@C.B。

在主 urls.py 中命名您的事件 url,然后使用 'events:past_events_index'

【讨论】:

    猜你喜欢
    • 2012-03-11
    • 1970-01-01
    • 2018-04-13
    • 2016-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-10
    相关资源
    最近更新 更多