【问题标题】:Exception Value: blog() takes exactly 2 arguments (1 given)异常值:blog() 正好接受 2 个参数(1 个给定)
【发布时间】:2012-06-20 22:09:51
【问题描述】:

几天来,我一直在努力在 Django 中设置视图/网址。努力理解它,每个人的做法似乎略有不同。

我想要实现的是:

我想有一个博客,我可以在该网站上发布新闻帖子,该网站将位于示例 - mysite.com/blog/ 然后您可以单击查看单独的帖子,它会从每个帖子中拉出蛞蝓。 (这非常有效)。

但是我想从博客应用程序中提取帖子,以便主页。因此,您可以查看最新帖子的 sn-p。我现在明白我需要在 app 文件夹之外和主目录中创建一个视图和一个 URL。但是我正在努力让他们联系在一起。我目前收到上面显示的错误消息。 “没有博客与给定的查询匹配。”这是我的 URL、模型和 2 个不同视图文件夹的代码。

//URLS for app and main directory

import authority
from django.conf import settings
from django.conf.urls import patterns, include, url
from django.conf.urls.defaults import url, include, patterns
from django.contrib import admin

admin.autodiscover()
authority.autodiscover()

urlpatterns = patterns('',
    url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
    (r'^authority/', include('authority.urls')),
    (r'^i18n/', include('django.conf.urls.i18n')),
    (r'^admin/', include(admin.site.urls)),

    url(r'^$', 'views.blog', name='index'),
    url(r'^blog/(?P<slug>[-\w]+)/$', 'blog.views.blog', name="blog"),
    url(r'^blog/$', 'blog.views.blog_index', name="blog_index"),
)

if settings.DEBUG:
    urlpatterns += patterns('',
        # Trick for Django to support static files (security hole: only for Dev environement! remove this on Prod!!!)
        url(r'^admin/pages/page(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.PAGES_MEDIA_ROOT}),
        url(r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT}),
        url(r'^admin_media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.ADMIN_MEDIA_ROOT}),
    )

urlpatterns += patterns('',      
    (r'^', include('pages.urls')),
    )

//主页的主视图

  from django.http import HttpResponse
    from django.shortcuts import render_to_response, get_object_or_404
    from django.template import RequestContext

from blog.models import Blog, NewsPost

def blog_index(request):
blogs = Blog.objects.filter(active=True)

return render_to_response('index.html', {
    'blogs':blogs,
}, context_instance=RequestContext(request))

//博客应用的浏览量

from django.http import HttpResponse
from django.shortcuts import render_to_response, get_object_or_404
from django.template import RequestContext

from blog.models import Blog, NewsPost

def blog_index(request):
    blogs = Blog.objects.filter(active=True)

    return render_to_response('blog/index.html', {
        'blogs':blogs,
    }, context_instance=RequestContext(request))

def blog(request, slug):
    blog = get_object_or_404(Blog, active=True, slug=slug)

    return render_to_response('blog/blog_post.html', {
        'blog': blog
    }, context_instance=RequestContext(request))

//博客应用程序中的模型

from django.contrib.auth.models import User



 class TimeStampedActivate(models.Model):
        created = models.DateTimeField(auto_now_add=True)
        modified = models.DateTimeField(auto_now=True)
        active = models.BooleanField(default=False, help_text="Controls 
        whether or now this news post is live")

    class Meta:
        abstract = True

class Blog(TimeStampedActivate):
    title = models.CharField(max_length=255, help_text="Can be 
    anything up to 255 character")
    slug = models.SlugField()
    description = models.TextField(blank=True, help_text="Give a short 
    description of the news post")
    content = models.TextField(blank=True, help_text="This is the main 
    content for the news post")
    user = models.ForeignKey(User, related_name="blog")

    def __unicode__(self):
        return self.title

    @models.permalink
    def get_absolute_url(self):
        return ('blog', (), {
            'slug': self.slug
        })

class NewsPost(TimeStampedActivate):
    title = models.CharField(max_length=255, help_text="title of the post")
    slug = models.SlugField()
    description = models.TextField(blank=True, help_text="Give a short 
    description of the news post")
    content = models.TextField(blank=True, help_text="This is the main 
    content for the news post")
    publish_at = models.DateTimeField(default=datetime.datetime.now(),
    help_text="Choose when the post is visible")

    blog = models.ForeignKey(Blog, related_name="posts")

    def __unicode__(self):
        return self.title

    class Meta:
        ordering = ['-publish_at', '-modified', '-created']

如果您需要更多信息,请随时询问!我对这一切都很陌生,所以放轻松! :) 提前致谢!

【问题讨论】:

  • 听起来你的blogpost 视图应该和你的blog_index 一样,对吗?您似乎想要或多或少相同的东西 - 博客文章列表。有什么区别?
  • 嗨 Daniel - 好的,我已经复制并粘贴了,博客应用程序的视图更改了 URL 导入的模型的名称。我没有收到此错误消息 - 无法导入名称博客
  • 对不起,什么? “更改了 URL 导入的模型的名称”——这是什么意思?如果您更改了某些代码,请更新上面的帖子,并显示实际的错误消息。
  • 这是我收到错误的那一行 - 从 URL 页面上的视图导入博客.. 我看不出有什么问题?我在另一个 views.py 文件中有另一个名为 blog 的视图是否冲突?
  • 异常类型:TypeError 异常值:blog() 只需要 2 个参数(给定 1 个)

标签: django django-models django-templates django-views


【解决方案1】:

改变

url(r'$', blog),

url(r'$', 'views.blog_index', name='index'),

或者写一个单独的视图。

您收到错误的原因是您尝试执行 blog 函数,该函数需要标题页中的 slug。你想要做的是从你的标题页显示index,而不是slug

此外,以下内容会令您感到痛苦:

from blog.views import blog_index, blog
from views import blog_index

您想使用哪个blog_index?您最好在 URL 中使用 'views.blog_index' 表示法。删除上面的那些导入,并且只在你的 URL 中使用基于字符串的视图名称,就像你对 blog/blog_index/ 所做的那样。

编辑:这是您的整个 URL 应显示的内容(以使其正常工作..)

import authority
from django.conf import settings
from django.conf.urls import patterns, include, url
from django.conf.urls.defaults import url, include, patterns
from django.contrib import admin

admin.autodiscover()
authority.autodiscover()

urlpatterns = patterns('',
    url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
    (r'^authority/', include('authority.urls')),
    (r'^i18n/', include('django.conf.urls.i18n')),
    (r'^admin/', include(admin.site.urls)),

    url(r'^$', 'views.blog', name='index'),
    url(r'^blog/(?P<slug>[-\w]+)/$', 'blog.views.blog', name="blog"),
    url(r'^blog/$', 'blog.views.blog_index', name="blog_index"),
)

if settings.DEBUG:
    urlpatterns += patterns('',
        # Trick for Django to support static files (security hole: only for Dev environement! remove this on Prod!!!)
        url(r'^admin/pages/page(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.PAGES_MEDIA_ROOT}),
        url(r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT}),
        url(r'^admin_media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.ADMIN_MEDIA_ROOT}),
    )

urlpatterns += patterns('',      
    (r'^', include('pages.urls')),
    )

【讨论】:

  • 嗨乔希,感谢您的回复,非常感谢。我现在有东西要加载。如果我将 url(r'/$', blog_index), URL 移动到 2 个博客 URL 的底部,则 /blog/ 页面加载正常。但是我在 URL 中添加了 / 。然后我遇到的问题是主页只加载没有样式的 HTML 等
  • 更新到上面的帖子:如果我转到 /blog/ 以外的任何带有斜杠的页面,它会加载带有 index.html 的模板(就像我想要的那样)但是当我去没有 / 例如 mysite.com 的主页它加载页面 CMS 中的第一页
  • @JoshDavies 我已通过修改 URL 以添加 ^ /$ 来更新我的答案。进行上述更改,然后告诉我你的进展情况。
  • @JoshDavies 还注意到 django 期望其所有 URL 都有一个尾部斜杠 /。有一个名为 APPEND_TRAILING_SLASH 之类的 django 设置,您可能需要查看它。
  • 好的,我现在将 urls.py 文件更改为您编辑的文件,但是我现在收到此错误消息:异常类型:ImportError 异常值:没有名为视图的模块
猜你喜欢
  • 2018-04-12
  • 1970-01-01
  • 2014-11-24
  • 2015-07-03
  • 1970-01-01
  • 2018-09-12
  • 1970-01-01
  • 2015-06-17
  • 1970-01-01
相关资源
最近更新 更多