Подтвердить что ты не робот

Как использовать UpdateView для обновления модели Django?

Я пытаюсь обновить модель в Django, используя общий обзор UpdateView на основе классов.

Я прочитал страницу Обновление модели пользователя в Django с помощью класса 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, но это, похоже, не встречается в переменной запроса. Я иду об этом неправильно?

Спасибо

Изменить: я думаю, я исправил это, но это может быть неправильно: Я изменил строки

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'])

Я мог ошибаться.

4b9b3361

Ответ 1

Это должно быть:

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)

Ответ 2

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