Пользовательский сайт администратора Django с родительским параметром url - PullRequest
3 голосов
/ 31 августа 2011

мой шаблон URL выглядит так: (r '^ fb / custom / (? P [a-zA-Z0-9 +] *) / admin /', include (custom_admin_site.urls)),

Я переопределил метод admin_view моего сайта администратора:

def admin_view(self, view, cacheable=False):
    def inner(request, *args, **kwargs):
        if kwargs.has_key('custom_id'):
            request.custom_id = kwargs.pop('custom_id')
        return view(request, *args, **kwargs)
    if not cacheable:
        inner = never_cache(inner)
    # We add csrf_protect here so this function can be used as a utility
    # function for any view, without having to repeat 'csrf_protect'.
    if not getattr(view, 'csrf_exempt', False):
        inner = csrf_protect(inner)
    return update_wrapper(inner, view)

Таким образом, мне не нужен параметр custom_id в методах представления, таких как index. Моя проблема в том, что я не могу использовать urlresolvers.reverse ('custom-admin: index'). Если я использую его без параметра, я получаю эту ошибку:

Page not found. Request URL:    http://localhost:8000/fb/custom/(?P%3Ccustom_id%3E[a-zA-Z0-9%5C+]*)/admin/

Окей, нет ничего удивительного. Я не предоставил параметр custom_id. Но с параметром я получаю эту ошибку:

reverse() got an unexpected keyword argument 'custom_id'

Есть идеи, как это решить. Я действительно хотел бы использовать обратный поиск. Тег шаблона URL имеет ту же проблему.

1 Ответ

0 голосов
/ 03 марта 2012

Несколько проблем с вашим шаблоном URL:

  1. Если вы не пытаетесь сопоставить пустую строку с вашим пользовательским идентификатором (что, я полагаю, нет), вы должны использовать + вместо *.
  2. Знак + должен выходить за скобки.
  3. Если вы просто пытаетесь сопоставить буквы и цифры, ваше регулярное выражение можно упростить до [\ w] +
  4. Наконец, если вы хотите именованный аргумент для пользовательского идентификатора, вы должны включить имя в ваш шаблон.

Так что в конечном итоге ваш шаблон URL должен выглядеть так:

(r'^fb/custom/(?P<custom_id>[\w]+)/admin/', include(custom_admin_site.urls)),

Теперь я не уверен, как вы пытаетесь вызвать urlresolvers.reverse, но если вам нужно передать args или kwargs, он должен выглядеть примерно так:

urlresolvers.reverse('custom-admin:index', args=[custom_id])

или для kwargs, как в приведенном выше примере:

urlresolvers.reverse('custom-admin:index', kwargs={'custom_id':custom_id})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...