2010-01-02 13 views
17

Estoy intentando crear un formulario personalizado de django para cambiar el nombre de usuario y el correo electrónico del usuario para una aplicación. Es por eso que necesito pasar los detalles del usuario de la sesión a un formulario para verificar si existe el usuario registrado. Estoy haciendo de esta manera:Pasando ** kwargs a Django Formulario

en views.py

personal_info_form = PersonalInfoForm(prefix='personal_info', 
             user_details=user_details) 

donde user_details es un diccionario:

'user_details': [{'username': u'username', 
        'registration_date': datetime.date(2009, 10, 22), 
        'id': 13, 'email': u'[email protected]'}]} 

En forms.py Tengo el siguiente código:

class PersonalInfoForm(forms.Form): 

    def __init__(self, *args, **kwargs): 
     user_details = kwargs.pop('user_details', None) 
     super(PersonalInfoForm, self).__init__(*args, **kwargs) 

    username = forms.CharField(required=True, initial=user_details[0]['username']) 
    email = forms.EmailField(required=True) 

Y me sale el siguiente error:

name 'user_details' is not defined 

He intentado acceder a él con self.user_details y sólo user_details y me da el mismo error

Respuesta

29

user_details se pasa al __init__, por lo que no se define fuera de él. Es por eso que no puedes acceder cuando estás instalando ese objeto CharField. Establecer initial en __init__ sí, después de haber hecho estallar desde kwargs, por ejemplo:

class PersonalInfoForm(forms.Form): 

    username = forms.CharField(required=True) 
    email = forms.EmailField(required=True) 

    def __init__(self, *args, **kwargs): 
     user_details = kwargs.pop('user_details', None) 
     super(PersonalInfoForm, self).__init__(*args, **kwargs) 
     if user_details: 
      self.fields['username'].initial = user_details[0]['username'] 

Cuando tienes la oportunidad, considere la posibilidad de leer en scopes in python.

+1

+1 hermoso. 10 segundos antes de enviar mi solución muy similar, aparece el banner naranja ... ¡muy bien hecho! – czarchaic

+0

Gracias, estoy leyendo acerca de los ámbitos en este momento :) –

2

Puede explicar de una manera más clara lo que está tratando de hacer? Creo que lo que estás haciendo es innecesario. No estoy seguro si he entendido, pero echar un vistazo a las formas de Django Modelo: http://docs.djangoproject.com/en/dev/topics/forms/modelforms/

>>> from django.forms import ModelForm 

# Create the form class. 
>>> class ArticleForm(ModelForm): 
...  class Meta: 
...   model = Article 

# Creating a form to add an article. 
>>> form = ArticleForm() 

# Creating a form to change an existing article. 
>>> article = Article.objects.get(pk=1) 
>>> form = ArticleForm(instance=article) 

Si se trata de lo que está buscando, usted puede fácilmente addapt utilizar su modelo de usuario. Recuerde, puede elegir los campos que desea permitir para ser modificado. El parámetro instance establece los valores de campo iniciales (que es lo que entendí que desea hacer). El ejemplo anterior mostrará todos los campos, el ejemplo a continuación muestra cómo mostrar solo 2 campos.

class PartialAuthorForm(ModelForm): 
    class Meta: 
     model = Author 
     fields = ('name', 'title') 

Hope I've help.

+0

Estoy intentando acceder a las variables de ** kwargs en la clase Forms. –

+1

¿Has probado: 'kwargs ['user_details']'? – Clash

+0

Sí. Me da nombre 'kwargs' no está definido –

Cuestiones relacionadas