Как заставить Django urlpattern принимать только слагов из модели - PullRequest
0 голосов
/ 16 сентября 2010

Я делаю сайт в Джанго. У меня есть модель блога, подобная этой:

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')),
)

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

Ответы [ 2 ]

1 голос
/ 16 сентября 2010

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

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

1 голос
/ 16 сентября 2010

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

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

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

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

Из документов Django :

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

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

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

  3. Add '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). Если он есть, он отображается.

...