Django - 反转包装视图功能

时间:2010-01-19 19:16:48

标签: django exception view wrapper reverse

我正在尝试将django-schedule纳入我的项目中。 Django-schedule的来源是here。我不喜欢网址,因为它们都捕获了一个slu ..我的项目每个用户只允许一个日历,因此捕获slug没有意义。所以,我像这样包装了django-schedule视图(使用当前用户查找slug,并将其传递给django-schedule的视图):

from schedule.views import calendar_by_periods
from schedule.models import Calendar
from schedule.periods import Month

def cal_by_periods_wrapper(view):
    def new_view(request, *args, **kwargs):
        kwargs['calendar_slug'] = Calendar.objects.get_calendars_for_object(obj=request.user, distinction="owner")[0].slug
        return view(request, *args, **kwargs)
    return new_view

以下是urls.py的相关部分:

urlpatterns = patterns('',
                url(r'^$',
                    cal_by_periods_wrapper(calendar_by_periods),
                           name = "month_calendar",
                           kwargs={'periods': [Month], 'template_name': 'schedule/calendar_month.html'}),

这可以正常工作,直到它碰到django-schedule,prev_url中包含的模板标签之一:

@register.simple_tag
def prev_url(target, slug, period):
    return '%s%s' % (
        reverse(target, kwargs=dict(calendar_slug=slug)),
            querystring_for_date(period.prev().start))

此功能提出:

TemplateSyntaxError at /teacher/calendar/

Caught an exception while rendering: Reverse for 'month_calendar' with arguments 
'()' and keyword arguments '{'calendar_slug': u'asdf'}' not found.

如何包装此视图并仍然可以进行反向调用?

1 个答案:

答案 0 :(得分:1)

这与包装函数无关。只是你不再拥有一个名为'month_calendar'的URL,它带有'calendar_slug'参数。在urlconf中定义一个,或编辑模板标签。

评论后编辑是,但'反向'调用仍在传递一个slug参数,并且没有'month_calendar'网址需要一个,因此反向匹配失败。