Como asignar a un input hidden un valor igual al usuario que crea el formulario??

427 views
Skip to first unread message

Iago Otero

unread,
Apr 17, 2021, 7:38:46 AM4/17/21
to djan...@googlegroups.com
Estoy tratando de crear un PRESUPUESTO a través de un formulario, y quieero indicarle el usuario al que pertenece ese presupuesto

CODIGO:

class Presupuesto(models.Model):
pertenece_a= models.OneToOneField(Perfil,on_delete=models.DO_NOTHING)
tipo={'OFERTA':'OFERTA','DEMANDA':'DEMANDA'}
ty= models.CharField('OFERTA/DEMANDA', choices=tipo.items(), max_length=50)
categorias = {'Construcción y Reformas': 'Construcción y Reformas',
'Arquitectura e ingeniería': 'Arquitectura e ingeniería',
'Servicios Profesionales y Oficios': 'Servicios Profesionales y Oficios',
'Servicios Personales y Domésticos': 'Servicios Personales y Domésticos',
'Logística y Transporte': 'Logística y Transporte', 'Otros': 'Otros'}
categoria = models.CharField('Categoría', max_length=200, choices=categorias.items())
provincias = {"Álava": "Álava", "Albacete": "Albacete", "Alicante": "Alicante", "Almería": "Almería",
"Asturias": "Asturias", "Ávila": "Ávila", "Badajoz": "Badajoz", "Barcelona": "Barcelona",
"Burgos": "Burgos", "Cáceres": "Cáceres", "Cádiz": "Cádiz", "Cantabria": "Cantabria",
"Castellón": "Castellón", "Ceuta": "Ceuta", "Ciudad Real": "Ciudad Real", "Córdoba": "Córdoba",
"Cuenca": "Cuenca", "Gerona": "Gerona", "Granada": "Granada", "Guadalajara": "Guadalajara",
"Guipúzcoa": "Guipúzcoa", "Huelva": "Huelva", "Huesca": "Huesca", "Islas Baleares": "Islas Baleares",
"Jaén": "Jaén", "La Coruña": "La Coruña", "La Rioja": "La Rioja", "Las Palmas": "Las Palmas",
"León": "León", "Lérida": "Lérida", "Lugo": "Lugo", "Madrid": "Madrid", "Málaga": "Málaga",
"Melilla": "Melilla", "Murcia": "Murcia", "Navarra": "Navarra", "Orense": "Orense",
"Palencia": "Palencia", "Pontevedra": "Pontevedra", "Salamanca": "Salamanca",
"Santa Cruz de Tenerife": "Santa Cruz de Tenerife", "Segovia": "Segovia", "Sevilla": "Sevilla",
"Soria": "Soria", "Tarragona": "Tarragona", "Teruel": "Teruel", "Toledo": "Toledo",
"Valencia": "Valencia", "Valladolid": "Valladolid", "Vizcaya": "Vizcaya", "Zamora": "Zamora",
"Zaragoza": "Zaragoza"}
donde = models.CharField('Provincia', max_length=200, choices=provincias.items())
telefono = models.CharField('Teléfono', max_length=20)
telf_visible = models.BooleanField('¿Desea que el telf. sea visible?', default=False)
email = models.EmailField('Email')
email_visible = models.BooleanField('¿Desea que el email sea visible?', default=False)
# num_contactos_recibir=models.CharField('Contactos a recibir',max_length=3,choices={'3','5','10','Todos'})
presupuesto_maximo = models.IntegerField('Presupuesto Máximo')
tiempo_ejecucion=models.CharField('Tiempo de ejecución',max_length=200,choices={'inmediato':'inmediato','1-3 meses':'1-3 meses','+3 meses':'+3 meses'}.items())
titulo = models.CharField('Titulo del proyecto', max_length=300)
descripcion = models.TextField('Descripción')
# imagenes=models.ImageField('Imagen o Logo',upload_to='/img/')
autonomo = models.BooleanField('¿Eres autónomo?')
empresa = models.BooleanField('¿Eres una empresa?')
particular = models.BooleanField('¿Eres un particular?')
contacto = models.CharField('Nombre o contacto',max_length=200)

def get_absolute_url(self):
return reverse("Pre_detail", kwargs={'pk':self.id})

def __str__(self):
return self.titulo +' / '+ self.telefono

class PreOF_FORM(forms.ModelForm):
###AQUI DEBERIA IR UN INPUT HIDDEN (pertenece_a), pero como?
     ###COMO HAGO PARA INDICARLE EL USUARIO QUE YA ESTA LOGUEADO????  

class Meta:
model = Presupuesto
fields = '__all__'



Alejandro Avendano

unread,
Apr 17, 2021, 8:07:42 AM4/17/21
to djan...@googlegroups.com
Para el campo oculto, debes agregar un widget de tipo HiddenInput en tu ModelForm. Aqui te va el link para la documentacion:


Luego, para agregar el usuario, seria asignando un valor inicial al field y tendrias que hacerlo de forma dinamica. Es decir al momento de carga el formulario. 

La unica forma que conozco de hacerlo, es desde el view. En el view, tienes el objeto request, que contiene el usuario. De alli sacar el usuario y lo asignas como valor inicial al field. 

Es algo muy sencillo, pero depende de como configuraste tus views. Si me envias tu codigo te puedo dar mas detalles


--
--
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.
---
Has recibido este mensaje porque estás suscrito al grupo "Django-es" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a django-es+...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/django-es/CAJ_xkV%2BUD77qsWzqh6T1poS5PncrD_mOhYqDr5LamRARDmtKQA%40mail.gmail.com.

Iago Otero

unread,
Apr 17, 2021, 11:32:00 AM4/17/21
to djan...@googlegroups.com
class CREATEPRESUPUESTO(CreateView):
template_name = 'createpreof.html'
model = Presupuesto
form_class = PreOF_FORM
class PreOF_FORM(forms.ModelForm):
pertenece_a=forms.CharField(widget=forms.HiddenInput())

class Meta:
model = Presupuesto
fields = '__all__'
he cambiado el model para poner pertenece_a como ForeignKey

como habria de hacer?? he usado una Class based View.....un get_context data?? un get_queryset??...como asigno el valor al campo hidden??

Marcos Lewis

unread,
Apr 18, 2021, 12:23:50 AM4/18/21
to djan...@googlegroups.com
Una forma de hacerlo,

Como el campo `pertenece_a` lo vas a asignar automáticamente deberías indicarle al formulario que excluyes al campo `pertenece_a`.
En el view deberías asignar el usuario logueado cuando se valida el formulario, en el método form_valid.

class PreOF_FORM(forms.ModelForm):

    class Meta:
        model = Presupuesto
        exclude = ['pertenece_a']



class CREATEPRESUPUESTO(CreateView):
    template_name = 'createpreof.html'
    form_class = PreOF_FORM

    def form_valid(self, form):
        # obtienes el usuario logueado
        user = self.request.user
        # cargas el perfil utilizando el usuario según sea tu  modelo
        perfil = ...
        form.instance.pertenece_a = perfil
        return super().form_valid(form)


Alejandro

unread,
Apr 18, 2021, 9:27:21 AM4/18/21
to Django-es
Es interesante la solucion que plantea Marcos, por mi parte nunca lo he intentado. 
La opcion que yo planteaba y que me ha resultado, va mas asi:

Ya agregastes el hidden widget en el ModelForm 
class PreOF_FORM(forms.ModelForm):
    pertenece_a = forms.CharField(widget=forms.HiddenInput())

    class Meta:
        model = Presupuesto
        fields = '__all__'


El CreateView contiene la funcion get_initial() que agrega los valores iniciales al formulario. Tienes que modificar esa funcion para adaptarla a tus campos: 
class CREATEPRESUPUESTO(CreateView):
    template_name = 'createpreof.html'
    model = Presupuesto
    form_class = PreOF_FORM

    def get_initial(self):
        user = self.request.user
        self.initial['pertenece_a'] = user   #esto tienes que modificar para ajustar a tus modelos. Explicacion abajo
        return self.initial.copy()

Sin embargo, tal como esta va a dar error.  Eso es porque "self.request.user" retorna un objeto de la clase User. Pero, el campo "pertenece_a" requiere un objecto de la clase Perfil. Queda de tu parte hacer las modificaciones para ajustarlas al modelo


Iago Otero

unread,
Apr 21, 2021, 12:48:52 PM4/21/21
to djan...@googlegroups.com
GRACIAS 

he solucionado con el form valid....

con el get_initial..no me funciono..pero ya guarda el usuario en oculto...y el proyecto sigue avanzando mil gracias

Reply all
Reply to author
Forward
0 new messages