2012-02-14 10 views
19

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

Я прочитал страницу Updating User model in Django with class based UpdateView, чтобы попытаться получить меня начался, но я получаю сообщение об ошибке объект «WSGIRequest» не имеет атрибут «идентификатор»

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

Благодаря

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

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

ответ

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 предполагают сохранение этой логики для views.py вместо шаблона url. - Из двух совпадений Django –

+2

В отрывке, который я опубликовал, нет никакой логики. @JacobValenta –

Смежные вопросы