2012-02-14 78 views
19

我想使用基於類的通用視圖UpdateView更新Django中的模型。如何使用UpdateView更新Django模型?

我讀Updating User model in Django with class based UpdateView頁面,試圖讓我開始,但我得到一個錯誤「WSGIRequest」對象有沒有屬性「ID」

我是一個新面孔來Django的,所以請原諒如果我在做一些愚蠢的事情。

//urls.py

url(r'^portfolios/update/(?P<id>\d+)/$',PortfoliosUpdateView.as_view()), 

//views.py

class PortfoliosUpdateView(UpdateView): 
    form_class = PortfoliosCreateForm 
    model = Portfolios 
    template_name = 'portfolios/create.html' 

    def get(self, request, **kwargs): 
     self.object = Portfolios.objects.get(id=self.request.id) 
     form_class = self.get_form_class() 
     form = self.get_form(form_class) 
     context = self.get_context_data(object=self.object, form=form) 
     return self.render_to_response(context) 

    def get_object(self, queryset=None): 
     obj = Portfolios.objects.get(id=self.request.id) 
     return obj 

它大多隻是代碼的修改版本最初發布,但我認爲它會工作。我知道我試圖檢索作爲GET參數傳遞的id,但這似乎並不通過請求變量。我是否以這種錯誤的方式去做?

感謝

編輯:我想我固定它,但這可能是錯誤的: 我改了行

self.object = Portfolios.objects.get(id=self.request.id) 
obj = Portfolios.objects.get(id=self.request.id) 

self.object = Portfolios.objects.get(id=self.kwargs['id']) 
obj = Portfolios.objects.get(id=self.kwargs['id']) 

我可能是錯的。

+3

您的更新確實修復了原來的錯誤。我不明白爲什麼你需要重寫''get''方法,看起來這就是''UpdateView''所做的。 – Raekkeri 2012-02-14 06:17:11

回答

22

它應該是:

def get_object(self, queryset=None): 
    obj = Portfolios.objects.get(id=self.kwargs['id']) 
    return obj 

看基於類的通用視圖調度解釋說,關鍵字參數被分配到self.kwargs:

def dispatch(self, request, *args, **kwargs): 
    # Try to dispatch to the right method; if a method doesn't exist, 
    # defer to the error handler. Also defer to the error handler if the 
    # request method isn't on the approved list. 
    if request.method.lower() in self.http_method_names: 
     handler = getattr(self, request.method.lower(), self.http_method_not_allowed) 
    else: 
     handler = self.http_method_not_allowed 
    self.request = request 
    self.args = args 
    self.kwargs = kwargs 
    return handler(request, *args, **kwargs) 
+0

謝謝澄清。我已經簡化了我的代碼。 – xyzjace 2012-02-14 22:51:59

6

id = self.request.GET.get('id',None)是您在嘗試訪問GET查詢字符串時需要的。

但是,你的觀點可以簡化爲:

from django.conf.urls import * 
from django.views.generic import UpdateView 
from yourapp.models import Portfolios 
from yourapp.forms import PortfoliosCreateForm 

urlpatterns = patterns('', 
    url('^portfolios/update/(?P<pk>[\w-]+)$', UpdateView.as_view(
     model=Portfolios, 
     form_class=PortfoliosCreateForm, 
     template_name='portfolios/create.html', 
     success_url='/portfolios' 
    ), name='portfolio_update'), 
) 
+1

我更喜歡在'myapp.views'中包裝我的視圖。例如。在'myapp.views'中:'portfolio_update = UpdateView.as_view(...)',那麼在urlconf中我只需要鍵入'url(r'pattern',「myapp.views.portfolio_update」,name =「portfolio_update」 )'。不適合所有目的,但我發現大部分觀點都比較清楚。 – sleblanc 2013-02-18 02:37:51

+2

儘管這是一個完全有效的解決方案,但最好的Django實踐建議保留views.py的邏輯,而不是在url模式中。 - 從Django的兩個勺子 – 2013-07-14 21:27:42

+2

我發佈的代碼段中沒有邏輯。 @JacobValenta – 2013-07-15 05:50:39