2012-02-14 90 views
19

Estoy intentando actualizar un modelo en Django utilizando la vista genérica basada en clase UpdateView.¿Cómo uso un UpdateView para actualizar un modelo de Django?

leí la página Updating User model in Django with class based UpdateView para tratar de ayudarme a empezar, pero estoy recibiendo un error objeto 'WSGIRequest' no tiene atributo 'id'

Soy una cara nueva a Django, por favor perdona si estoy haciendo algo estúpido

//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 

sobre todo es sólo una versión modificada del código escrito originalmente, pero pensé que iba a trabajar. Sé que estoy intentando recuperar el ID pasado como un parámetro GET, pero eso no parece venir en la variable de solicitud. ¿Voy por esto de la manera incorrecta?

Gracias

Editar: Creo que me fijo, pero esto puede estar equivocado: he cambiado las líneas

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

a

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

podría estar equivocado.

+3

Su actualización soluciona el error original correctamente. Sin embargo, no veo por qué tiene que anular el método '' get'', parece que '' UpdateView'' lo hace de todos modos. – Raekkeri

Respuesta

22

que debe ser:

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

Mira clase genérica vista de envío basado explica que los argumentos de palabras clave se asignan a 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

Gracias por aclarar. He simplificado mi código de manera significativa. – xyzjace

6

id = self.request.GET.get('id',None) es lo que necesita al intentar acceder a la cadena de consulta GET.

Sin embargo, su punto de vista se puede simplificar:

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

Prefiero ajustar mis vistas en 'myapp.views'. P.ej. en 'myapp.views':' portfolio_update = UpdateView.as_view (...) ', en el urlconf solo necesito escribir' url (r'pattern ', "myapp.views.portfolio_update", name = "portfolio_update") '. No se adapta a todos los propósitos, pero me parece más limpio para la mayoría de mis puntos de vista. – sleblanc

+2

Si bien esta es una solución totalmente válida, las mejores prácticas de Django sugieren mantener esa lógica para views.py en lugar de en el patrón de url. - Desde Two Scoops of Django –

+2

No hay lógica en el fragmento que publiqué. @JacobValenta –

Cuestiones relacionadas