2014-12-29 21 views
4

我是Django的新手,迄今爲止我的所有項目都使用了通用視圖。我叫他們在url.py代碼錯誤實例化Django中的視圖類

模式(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()), 
) 

回答

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 }} 

的基於類的視圖的妙處在於,你的對象的上下文被傳遞給你。

+0

我知道這會工作,但您從來沒有調用modelFuncTest(),這是我試圖解決的問題。我知道這個例子並不需要它被調用來工作,但我試圖在做更多的事情之前在更小的範圍內測試來自不同類的調用方法。 – Oblivionkey3

+0

@ Oblivionkey3如果您試圖在模型上完成調用getBody()函數,那麼在模板類型{{post.getBody}}中將會返回您的body。你不應該這樣認爲。 – awwester

+0

如果你堅持從你的url文件中調用這個函數,那只是一個不好的做法,我對此沒有任何評論:) – awwester

0

你仍然需要在調用該函數as_view()你的分類在你urlpatterns

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

至於這樣的:

另外,如何來調用DetailView.as_view時,我沒有得到同樣的錯誤()中的DetailView類也不會被實例化,對?

as_view()函數是一個類方法,它返回視圖類的一個實例,當你的URL模式被命中時,它可以被調用。

+0

如果我使用url調用as_view(),我該如何調用modelFuncTest()? – Oblivionkey3

+0

你不這樣做,Django調用從'as_view()'調用創建的視圖實例。這意味着您應該將'modelFuncTest()'的名稱更改爲'get()'。您應該閱讀https://docs.djangoproject.com/en/1.7/topics/class-based-views/intro/,或者甚至從基於視圖的函數開始(在開始之前更容易開始)基於類的觀點。也回過頭來看看視圖上的Django教程。祝你好運! –

+0

感謝您的幫助,我找到了一些在線資源,現在就得到它 – Oblivionkey3