没有FlatPages匹配给定的查询

时间:2010-11-28 20:18:48

标签: python django

我对settings.py flatpages的必要更改感到愤怒。然后在管理员中我创建一个平面/关于/。但是当我运行http://localhost:8000/about/时,它会404呈现No FlatPages matches the given query。我的default.html位于project/templates/flatpages/default.html.

urls.py

urlpatterns = patterns('',
    (r'^admin/', include(admin.site.urls)),
    (r'^(?P<url>about/)$', 'django.contrib.flatpages.views.flatpage'),
)

settings.py

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
      #'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware',                                                                                                 
)

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.admin',
    'django.contrib.flatpages',)

6 个答案:

答案 0 :(得分:5)

看起来您可能想稍微阅读named groups

但是现在尝试将它放在你的urls.py中:

# last entry in urls.py.  letting flatpages handle found pages or throw 404's
(r'', include('django.contrib.flatpages.urls')),

这只是确保我们正确连接了网址。接下来让我们看看我们如何创建FlapPage对象。通过/ admin是最简单的,但你也可以使用shell。手动创建这些技巧的诀窍是添加网站。

./manage.py shell
> from django.contrib.flatpages.models import FlatPage
> fp = FlatPage.objects.create(url="/test/", content="This is a test...")
> fp.sites.add(1) # in dev you are probably using site.id == 1.

您可以尝试使用现有的FlatPage对象。只需确保它与网站相关联。

> about = FlatPage.objects.get(url="/about/")
> about.sites.all()
[]
> # Empty list of sites.  This will give you a 'No FlatPage matches' 404.
> about.sites.add(1)

现在启动服务器,看看它是怎么回事。如果您尚未创建flatpages / default.html模板,则会收到TemplateDoesNotExist异常。

答案 1 :(得分:2)

在遵循提供的大多数解决方案后,您应该考虑的最重要的因素是django文档中没有指出的是SITE_ID = 1。

默认情况下,Django在网站的管理面板上提供“example.com”。添加flatpages时,可能会添加自己的网站,大多数教程都会指示您在settings.py上使用SITE_ID = 1。

不告诉你的是“example.com”网站默认为1.所以你应该做的就是将“example.com”网站编辑到127.0.0.1:8000然后就可以了。

记得还要添加 url.py

# last entry in urls.py.  

(r'',include('django.contrib.flatpages.urls')),

settings.py`

MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware'

INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.flatpages',

答案 2 :(得分:1)

如果您在网站应用程序中更改了(添加新网站),则必须在settings.py中更改SITE_ID,其值与新添加的网站相匹配。

答案 3 :(得分:0)

出于某种原因,只有当你使用site_id = 1时它才会起作用。

答案 4 :(得分:0)

这让我在墙上开了一段时间,但这可能就是你被卡住了。当你在管理网站上定义一个页面时,如果你没有在网站名称后面加/,它会给你一个404。

即。网址:/ first-page / vs / first-page

第一个版本可以使用,而第二个版本将是404.这可能是你坚持的版本?如果没有,只需将其发布给其他人,这些人可能会遇到困扰我的同一问题。

答案 5 :(得分:0)

这假设您已经在FlatPage中创建了一行。关注Django Unleashed 2016第15章。不确定我得到了它。显然我们已经在Site中有一行(显然这是在迁移过程中幕后发生的),但我们必须在FlatPage中创建一个,然后将我们唯一的Site对象添加到FlatPage的站点字段: (在shell中)

 from django.contrib.flatpages.models import FlatPage, Site
 fp=FlatPage.objects.get(pk=1)
 our_site=Site.objects.all()[0]
 fp.sites.add(our_site)
 fp.save()