2012-02-14 3 views
19

클래스 기반의 일반 뷰 UpdateView를 사용하여 장고에서 모델을 업데이트하려고합니다.어떻게 UpdateView를 사용하여 장고 모델을 업데이트합니까?

내가 노력하고 내가 시작 페이지 Updating User model in Django with class based UpdateView를 읽을 수 있지만 내가 오류 'WSGIRequest'개체가 어떤 속성 'ID'내가 장고에 새로운 얼굴이야

이 없습니다 받고 있어요, 그래서 용서하시기 바랍니다 내가 바보 같은 짓을하고 있다면.

//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.kwargs['id']) 
obj = Portfolios.objects.get(id=self.kwargs['id']) 

에 선을

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

을 내가 잘못 될 수 변경되었습니다.

+3

업데이트로 인해 원래 버그가 올바르게 수정되었습니다. 나는 왜 당신이''get'' 메소드를 오버라이드 할 필요가 있는지 보지 못한다. 어쨌든''UpdateView''가 후드에서하는 것처럼 보입니다. – Raekkeri

답변

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

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

+2

이것은 완전히 유효한 해결책이지만 최고의 Django 실습에서는 url 패턴 대신에 views.py에 대한 논리를 유지할 것을 제안합니다. - 두장의 장고에서 –

+2

내가 게시 한 스 니펫에 논리가 없습니다. @JacobValenta –

관련 문제