Obtener id de usuario logueado para un formulario

2,718 views
Skip to first unread message

WolveLopez

unread,
Jul 13, 2012, 6:55:42 AM7/13/12
to djan...@googlegroups.com
Hola compañeros.
Tengo los forms.py creados y todos funcionan perfectamente, pero ha saltado una duda.
En uno de los formularios, necesito el id del usuario logueado en la aplicacion es ese momento el cual consigo en la vista mediante:

def nueva_tap(request):    
if request.method == 'POST':        
formulario = AltaTapForm(request.POST, request.FILES)
if formulario.is_valid():
formulario.save()
return HttpResponseRedirect('/tapas')
else:
formulario = AltaTapForm()
usuario = request.user.id
return render_to_response('altatapa.html', {'formulario':formulario, 'usuario':usuario}, context_instance=RequestContext(request))
 
Este id lo paso a la plantilla y debe ser un campo de ese formulario, el cual no quiero que el cliente vea.
Problema: Si cargo el formulario normal me apacere el campo usuario, con todos los usuarios dados de alta dentro de la apliacion y eso no quiero.
Dentro de forms.py he excluido el campo usuario y en el template lo cargo a mano de esta forma:
  
 <form id="formulario" method="post" enctype="multipart/form-data" action="">{% csrf_token %}
{{formulario.as_p}}
<p><input type="hidden" id="id_usuario" name="usuario" value="{{usuario}}"></p>
<p><input type="submit" value="Confirmar"></p>
  </form>

El problema que tengo es que al dar input a ese fromulario me tira el error de que falta el campo id de usuario.
¿Sabeis como se puede solucionar esto?
Por cierto en forms.py tengo esto:

class AltaTapForm(ModelForm):
class Meta:
model = Tap
#excluimos el usuario porque lo recogemos en la vista al estar logueado y posterioemente lo generamos en el html
#exclude = ('usuario',)
 
Saludos y gracias de antemano.

Jhónatan Mosquera

unread,
Jul 13, 2012, 4:23:21 PM7/13/12
to djan...@googlegroups.com
Lee esta parte de la documentación:  https://docs.djangoproject.com/en/1.4/topics/forms/modelforms/#the-save-method ahi te dice claramente como puedes solucionar tu problema, en realidad no tienes que poner el id del usuario en el form, sino que al momento de ver la condicional si en request hay POST ahi debes de hacer el instance del usuario, 
..........
tap = Tap(usuario=request.user)
formulario = AltaTapForm(request.POST, request.FILES, instance=tap)
.........
 y eso es todo

--
------------------------------------------
Jhónatan Mosquera Tabra

wolvelopez

unread,
Jul 13, 2012, 7:32:48 PM7/13/12
to djan...@googlegroups.com
Muchas gracias Jhónatan, funciona perfectamente, pero en el cado de que quiera hacerlo con dos campos me tira este error:

Exception Type:
SyntaxError
Exception Value:
keyword argument repeated (views.py, line 57)

Sabes como podría hacerlo, es que estoy intentando comprenderlo pero no lo consigo, de momento tengo esto en la vista:
def comentar_tap(request, id_tap):
    dato = get_object_or_404(Tapa, pk=id_tap)
    comments = Comentario.objects.filter(com_tap = dato)
    #valorar el formulario de comentarios
    if request.method == 'POST':
    tapa = Comentario(com_tapa=dato)
    usuario = Comentario(usuario=request.user)
        formulario = AltaComentarioForm(request.POST, instance=tap, instance=usuario)

        if formulario.is_valid():
            usuario =  request.user                       
            formulario.save()
            #devolver a pagina de comentarios
            pag_comentario = '/comentar_tap/%s' % id_tap                      
            return HttpResponseRedirect(pag_comentario)
    else:
        formulario = AltaComentarioForm()
        if formulario.is_valid():
            com_tap = formulario.cleaned_data['com_tap']
            comentario = formulario.cleaned_data['comentario']
            usuario = request.user            
            return HttpResponseRedirect('/taps')
        else:
            formulario = AltaComentarioForm()   
    return render_to_response('altacomentario.html', {'dato':dato, 'comments':comments, 'formulario':formulario}, context_instance=RequestContext(request))

Gracias de antemano. 

wolvelopez

unread,
Jul 13, 2012, 8:01:24 PM7/13/12
to djan...@googlegroups.com
Vale, lo he conseguido de esta manera, haciendo un falso commit y después metiéndole los valores. Una vez hecho esto hago el verdadero commit:

@login_required(login_url='/ingresar')
def comentar_tap(request, id_tap):
    dato = get_object_or_404(Tap, pk=id_tap)

    comments = Comentario.objects.filter(com_tap = dato)
    #valorar el formulario de comentarios
    if request.method == 'POST':    
        formulario = AltaComentarioForm(request.POST)        
        if formulario.is_valid():
            #hacemos un falso commit para despues variar valores antes de hacer el verdero commit                       
            form = formulario.save(commit=False)
            #modificamos los valores
            form.usuario = request.user
            form.com_tap = dato
            form.save()

            #devolver a pagina de comentarios
            pag_comentario = '/comentar_tap/%s' % id_tap                      
            return HttpResponseRedirect(pag_comentario)
    else:
        formulario = AltaComentarioForm()
        if formulario.is_valid():
            com_tap = formulario.cleaned_data['com_tap']
            comentario = formulario.cleaned_data['comentario']
            usuario = request.user            
            return HttpResponseRedirect('/taps')
        else:
            formulario = AltaComentarioForm()   
    return render_to_response('altacomentario.html', {'dato':dato, 'comments':comments, 'formulario':formulario}, context_instance=RequestContext(request))

¿Cómo lo veis?¿Es valido hacer esto?

Martín García

unread,
Jul 14, 2012, 7:24:22 AM7/14/12
to djan...@googlegroups.com
Buenas, es totalmente valido hacer eso. De hecho creo que es la mejor manera ya que por mucho que el cliente modifique el input para asignar el id de otro usuario, tu lo sobreescribes con el valor correcto antes de guardar.

-- 
Martín García Monterde
Tel: 668878187

--
Ha recibido este mensaje porque está suscrito a Grupo "Grupo de Usuarios del Framework Django de habla hispana" de Grupos de Google.
Si quieres publicar en este grupo, envía un mensaje de correo
electrónico a djan...@googlegroups.com
Para anular la suscripción a este grupo, envíe un mensaje a django-es-...@googlegroups.com
Para obtener más opciones, visita este grupo en http://groups.google.com.bo/group/django-es.

Reply all
Reply to author
Forward
0 new messages