2012-01-07 16 views
5

Estoy usando modelos para obtener listas de reproducción y sus elementos. También contiene script de inicio de sesión. Estoy intentando configurar el usuario actualmente conectado al modelo de usuario. Esto se puede ver lo que he publicado antes How to avoid this dropdown combo box?valueError en modelos

class playlistmodel(models.Model): 
    user = models.ForeignKey(User) 
    title = models.CharField(max_length=200) 

    def __unicode__(self): 
     return self.title 

class itemsmodel(models.Model): 
    playlist = models.ForeignKey(playlistmodel) 
    item = models.TextField() 

    def __unicode(self): 
     return self.item 

class playlistform(ModelForm): 
    class Meta: 
     model = playlistmodel 
     exclude = {'user'} 

class itemsform(ModelForm): 
    class Meta: 
     model = itemsmodel 
     exclude = {'playlist'} 

Aquí es la vista lista de reproducción:

archivo
def playlistview(request): 
    if request.method == 'POST': 
     form = playlistform(request.POST) 
     if form.is_valid(): 
       data = form.save(commit=False) 
       data.user = request.user 
       data.save() 
       return render_to_response('playlist.html', {'data': data}) 
    else: 
     form = playlistform() 
     return render_to_response('playlist.html', {'form': form, 'user': request.user}, context_instance=RequestContext(request)) 

Playlist.html:

https://gist.github.com/1576136

página de error:

https://gist.github.com/1576186

Pero estoy ValueError:

Exception Type: ValueError Exception Value: Cannot assign "<django.utils.functional.SimpleLazyObject object at 0x7f0234028f50>": "playlistmodel.user" must be a "User" instance 

Traceback: Local vars --- data.user = request.user 

Aquí es mi settings.py https://gist.github.com/1575856

Gracias.

+1

Por si acaso, verifique que tiene el valor predeterminado [TEMPLATE_CONTEXT_PROCESSORS] (https://docs.djangoproject.com/en/1.3/ref/settings/#template-context-processors) en su 'settings.py' –

+0

versión de Django estás usando? Intenta 'datos.user_id = request.user.id' en su lugar. – Alasdair

+0

@ César He publicado el enlace para settings.py en mi sección de preguntas. – rnk

Respuesta

0

difícil de decir, pero me gustaría probar esto en su playlistview:

form = playlistform(request, request.POST, instance=playlistmodel) 

tal vez usted puede ommit el último parámetro (ejemplo = playlistmodel), porque esto sólo sería en necesidad si se cambia un objeto existente

Espero que esto ayude ...

+0

Parece que la sintaxis anterior no funcionará. Muestra el error de atributo. Gracias. – rnk

+0

Triste :(, todo lo que puedo decir es que esta sintaxis funciona para mí en una situación similar. – Jingo

0

tengo el mismo problema, pero sólo surge cuando el usuario no está conectado (esperando una instancia AnonymousUser). Al menos cuando mi superusuario inició sesión, no encontré ningún problema.

A pesar de que no he encontrado todavía una solución, tal vez usted encontrará una pista en este answer

Bueno, ahora me he dado cuenta de que en mi caso AnonymousUser debe ser almacenado como nulo en el PP, pero deja esta respuesta para publicar el enlace de la pista (no tiene permiso todavía para dejar comentarios).

Espero que ayude!

5

Sé que esta publicación es antigua, pero si alguien llega aquí con el mismo problema, la respuesta es que request.user es en realidad un contenedor para auth.user de django. Así que request.user es un SimpleLazyObject, y su propósito es evitar la creación de instancias innecesarias, y también implementar un simple mecanismo de caché de usuario. Para acceder al usuario real (y instanciarlo, cuando se accede a la primera vez), que tiene que hacer:

auth.get_user(request)

esto le dará una instancia de auth.user. Si necesita más detalles sobre lo que sucede dentro, consulte this post.

Cuestiones relacionadas