Использование переменных в Django urlpatterns - PullRequest
0 голосов
/ 04 июля 2010

Компоненты URL-адресов приложения Django, над которым я работаю, очень «подключаемые», и их различные комбинации используются в разных urlpatterns, поэтому наш urls.py выглядит примерно так:

rev = r'(/R\.(?P<rev>\d+))?'
repo_type= r'^(?P<repo_type>svn|hg)/'
path = r'/dir/(?P<path>.*)$'
# etc.

urlpatterns = patterns('',
    (repo_type_param + r'view-source' + opt_rev_param + path_param, view_source),
    (repo_type_param + r'history' + path_param, history),
    (repo_type_param + r'revision' + opt_rev_param + r'/$', revision),
) #etc.

Что кажется хорошим способом сохранить вещи в чистоте. Однако я обнаружил, что получаю ошибки NoReverseMatch, когда пытаюсь отменить любое из представлений, на которые указывают urlpatterns. После долгих попыток я обнаружил, что использование полной необработанной строки в шаблоне вместо конкатенации подстрок решило проблему.

Итак, действительно ли необходимо использовать только необработанные строки в urlpatterns? Я не мог найти это нигде. Баг или фича? Необходимость копировать и вставлять шаблоны регулярных выражений, которые используются неоднократно, кажется нарушением DRY.

Ответы [ 3 ]

1 голос
/ 06 июля 2010

Я не уверен насчет конкатенации, но знаю, что вы можете форматировать необработанные строки и использовать их в urlpatterns.См. BlogView.urlpatterns для примера.

1 голос
/ 04 июля 2010

Я обнаружил, что этот шаблон работает для перенаправлений и может помочь в вашем случае (если я неправильно интерпретирую ваш вопрос). Я не мог изменить шаблон внутри того же кортежа, но если бы я определил новый кортеж, а затем сцепил новый кортеж с исходным Djanogo, это отражалось бы без проблем. например:

  urlpatterns = patterns('',
         ('^foo/$','foo.views.foo')
  )
  urlpatterns+= patterns('',('^$','django.views.generic.simple.redirect_to',{'url':reverse('foo.views.foo')}))
0 голосов
/ 04 июля 2010

Вы можете использовать имя, чтобы идентифицировать ваш шаблон URL-адреса следующим образом:

urlpatterns = patterns('',
     url(repo_type_param + r'view-source' + opt_rev_param + path_param, view_source, name='myurlname'),
)

Запишите URL-адрес и имя, а затем выполните обратное сопоставление следующим образом:

reverse('myurlname', kwargs={'groupname': 'value'})

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...