2010-09-16 1 views
0

Я создаю сайт в Django. У меня есть блог модели, как это:Как сделать Django urlpattern принимать только пули из модели

class Blog(models.Model): 
    name = models.CharField(max_length=255) 
    slug = models.SlugField(max_length=255) 
    ... 

И я хочу, чтобы первые страницы каждого блога, чтобы быть в URL, как это: www.example.com/blog-slug/

Однако, я Кроме того, используя Flatpages и хотите, чтобы быть в состоянии соответствовать URL, например: www.example.com/flat-page/

Так urlpatterns, как это не будет работать:

urlpatterns = patterns('', 
    (r'^(?P<blog_slug>[-\w]+)/$', 'weblog_index', {}), 
    ... 
    (r'^', include('django.contrib.flatpages.urls')), 
) 

потому что все Flatpages URL-адресов попадет в ловушку первый образец. Думаю, я хочу, чтобы первый шаблон был только соответствовал действительным слизнякам из модели блога, но я не уверен, как это сделать.

ответ

1

Вы не можете сделать это:

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

Поскольку да, Django пытается только просмотреть первое представление, соответствующее вашему регулярному выражению. Если эта точка зрения вызывает 404, она не пытается использовать другие URL-адреса.

Однако, вы можете делать то, что вы пытаетесь сделать, ничего не добавляя к вашему urls.py:

Из Django docs:

Чтобы установить приложение flatpages, выполните следующие действия:

  1. Установите рамки сайтов, добавив 'django.contrib.sites' в комплект INSTALLED_APPS. если он еще не там.

  2. Также убедитесь, что вы правильно установили SITE_ID на идентификатор сайта, который представляет файл настроек. Это, как правило, 1 (т.е. SITE_ID = 1, но если вы используете базу сайтов для управления несколькими сайтами, это может быть идентификатор другого сайта.

  3. Добавить 'django.contrib.flatpages' вашей установке INSTALLED_APPS.

  4. Добавить 'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware' вашей установке MIDDLEWARE_CLASSES.

  5. Выполните команду manage.py syncdb.

В принципе, если ваши приложения в блогах поднимают Http404, когда сталкиваются с пули, для которых нет записи в блоге, вы должны быть добрым идти.

Размещение 'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware' в вашем MIDDLEWARE_CLASSES означает, что перед Django отображает страницу ошибки, она проверяет наличие FlatPage с пути согласования URL, который сгенерировал 404 (т.е.если есть 404, он возвращается к проверке на FlatPage). Если он есть, он делает это.

+0

Я не уверен, что следую ... Теперь я попытался настроить представление «weblog_index», которое делает get_object_or_404(), используя сопоставленный blog_slug. Это работает в том, что отображается правильная страница, но если она терпит неудачу, она не переходит к попытке сопоставления URL Flatpages. –

+0

(Который я бы не ожидал этого - как только Django сопоставил URL-адрес и перешел к представлению, он не вернется и попробует больше URL-адресов после того, как он ...?) –

+0

Я думаю, что OP спрашивает для сопоставления плоских просмотров страниц с значениями поля слива. –

1

Как указывает Доминик, вся суть приложения Flatpages заключается в том, что он автоматически соответствует любым страницам, которые не попадают в другие виды.

Таким образом, даже если вы не можете ограничить weblog_index вид только действительные слизней, вы можете сделать простой get_object_or_404 в этой точке зрения, так что он выдает ошибку 404, когда нет соответствия Блог пробкового не найден - и что 404 немедленно перехватывается приложением Flatpages, и все работает так, как вы этого хотите.

+0

Я должен делать что-то неправильно, потому что, если я использую URL-адрес известной Flatpage, тогда представление weblog_index генерирует 404, потому что URL-адрес не содержит действительного blog_slug, а браузер отображает 404 («Нет совпадений в блоге» данный запрос. "). Он * не * перехватывается приложением Flatpages. –

+0

И, да, я * делал что-то неправильно! Я бы забыл добавить 'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware' в настройку MIDDLEWARE_CLASSES. Таким образом, он не искал Flatpages после 404-х годов и полагался только на все сопоставления URL-адресов, которые терпят неудачу. Спасибо за ваш ответ Дэниел, который побудил меня расспросить, что я делаю, и перечитать документы! –