Django - полностью измененные функции представления - PullRequest
2 голосов
/ 19 января 2010

Я пытаюсь включить django-schedule в свой проект.Источник Django-schedule здесь .Мне не нравятся URL, потому что они все захватывают слизняка.Мой проект допускает только один календарь на пользователя, поэтому нет смысла перехватывать слаг.Итак, я обернул представления django-schedule следующим образом (найдите слаг с использованием текущего пользователя и передайте его представлениям 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 Ответ

1 голос
/ 19 января 2010

Это не имеет ничего общего с упаковкой функции. Просто у вас больше нет URL с именем month_calendar, который принимает аргумент calendar_slug. Либо определите его в вашем urlconf, либо отредактируйте тег шаблона.

Редактировать после комментария Да, но обратный вызов все еще передает аргумент slug, и не существует URL-адреса month_calendar, который принимает единицу, поэтому обратное сопоставление не выполняется.

...