web-dev-qa-db-ja.com

UpdateViewを使用してDjangoモデルを更新するにはどうすればよいですか?

クラスベースの汎用ビューUpdateViewを使用して、Django=でモデルを更新しようとしています。

私はページを読みます DjangoクラスベースのUpdateView でユーザーモデルを更新して試してみますが、 mエラー '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'])

私は間違っている可能性があります。

20
xyzjace

そのはず:

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)
24
bmihelac

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'),
)
7
Burhan Khalid