【问题标题】:Error Instantiating View Classes in Django在 Django 中实例化视图类时出错
【发布时间】:2015-02-25 06:25:35
【问题描述】:

我是 Django 新手,到目前为止我的所有项目都使用了通用视图。我在 url.py 代码中使用

调用了它们

模式(r'^url$',DetailView.as_view())

但是,现在我正在尝试制作自己的基于类的视图,但遇到了麻烦。我尝试做一个简单的测试,从我的视图中调用一个 model.py 函数,但是我得到一个错误,我没有实例化该类的实例。我应该如何实例化视图类?另外,为什么我在调用 DetailView.as_view() 时没有得到同样的错误,DetailView 类也没有被实例化,对吧?

我的代码:

models.py

class Post(models.Model):
    title = models.CharField(max_length=140)
    body = models.TextField()

    def __unicode__(self):
        return self.title

    def getBody(self):
        return self.body

view.py

class RatingView(generic.DetailView):
    model = Post
    template_name = "like.html"

    def __init__(self):
        model = Post
        template_name = "like.html"

    def modelFuncTest(self):
        return HttpResponse(self.model.getBody())

url.py

from django.conf.urls import patterns, include, url
from django.views.generic import ListView, DetailView
from blog.views import RatingView
from blog.models import Post

urlpatterns = patterns('',
    url(r'^(?P<pk>\d+)/like/$', RatingView.modelFuncTest()),
)

【问题讨论】:

    标签: python django class view instance


    【解决方案1】:

    将您的 views.py 更改为:

    class RatingView(generic.DetailView):
        model = Post
        template_name = "like.html"
    

    并将 urls.py 更改为:

    from django.conf.urls import patterns, url
    from blog.views import RatingView
    
    urlpatterns = patterns('',
        url(r'^(?P<pk>\d+)/like/$', RatingView.as_view()),
    )
    

    这应该可以帮助您入门,如果在进行这些更改后出现错误,请告诉我。

    django docs 中有一些很好的例子,如果你还没有看到的话。

    编辑:另外,在模板中,你应该像这样得到你的身体:

    {{ post.body }}
    

    基于类的视图的美妙之处在于您的对象的上下文会为您传递。

    【讨论】:

    • 我知道这行得通,但你从未调用过 modelFuncTest(),这是我要解决的问题。我知道这个例子不需要调用它来工作,但我试图在做更多之前在更小的范围内测试来自不同类的调用方法。
    • @Oblivionkey3 如果你试图在你的模型上完成调用 getBody() 函数,那么在模板中输入 {{ post.getBody }} 这将返回你的身体。您不应该在视图中这样做。
    • 如果您坚持从您的 urls 文件中调用该函数,那只是一种不好的做法,我对此没有任何评论:)
    • 那我该如何调用这个函数呢?就像我说的,我是 Django 新手,我知道如何制作函数等。只是我不知道我应该如何使用它们。
    • @Oblivionkey3 正确,基于函数的视图根本不是坏习惯,但这是一个不同的问题。如果您在问题中有models.py,然后在答案中有views.py和urls.py,在您的“like.html”模板中,您将能够调用{{ post.getBody }} 这将在您的模型上调用 getBody 函数。试试看。
    【解决方案2】:

    您仍然需要在 urlpatterns 中的类上调用 as_view() 函数:

    urlpatterns = patterns('',
                           url(r'^(?P<pk>\d+)/like/$', RatingView.as_view()),
                           )
    

    至于这个:

    另外,为什么我在调用 DetailView.as_view() 时没有得到同样的错误,DetailView 类也没有被实例化,对吧?

    as_view() 函数是一个类方法,它返回一个视图类的实例,当你的 URL 模式被命中时可以调用该实例。

    【讨论】:

    • 如果我用url调用as_view(),如何调用modelFuncTest()?
    • 你不知道,Django 调用你的视图实例,该实例是从 as_view() 调用创建的。这意味着您应该将modelFuncTest() 的名称更改为get()。在处理基于类的视图之前,您可能应该阅读docs.djangoproject.com/en/1.7/topics/class-based-views/intro 或什至从具有基于函数的视图(更容易上手)的第一格开始。还回去看看关于视图的 Django 教程。祝你好运!
    • 感谢帮助,我在网上找到了一些资源,现在就搞定了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-02
    • 1970-01-01
    • 1970-01-01
    • 2015-04-30
    • 2016-06-01
    • 2021-08-24
    相关资源
    最近更新 更多