widgets formularios form fields example avanzados python django django-forms

python - formularios - Django View Class: el nombre ''self'' no está definido



modelform django (1)

Estoy trabajando en el marco de Django. Ahora estoy haciendo una clase para el registro de usuarios como a continuación. Recibí un error en el número de línea 6. ¿Podrían ayudarme?

1: class JoinForm(forms.Form): 2: MONTH = { 3: 1:(''Jan''), 2:(''Feb''), 3:(''March''), 4:(''Apl''), 5:(''May''), 6:(''Jun''), 4: 7:(''July''), 8:(''Aug''), 9:(''Sep''), 10:(''Oct''), 11:(''Nov''), 12:(''Dec'') 5: } 6: YEAR = self.makeYearChoice(self,1940) 7: email = forms.EmailField(label=''Email Address'', max_length=50) 8: name = forms.CharField(label=''Real Name'', max_length=20) 9: birth = forms.DateField(label=''Birth Date'', widget=SelectDateWidget(years=YEAR, months=MONTH)) 10: loc = forms.CharField(label=''Resident Location'', max_length=40) 11: passwd = forms.CharField(label=''Password'', max_length=16, widget=forms.PasswordInput) 12: def makeYearChoice(self,startYear): 13: YEARS = (); 14: thisYear = datetime.now().year 15: for year in range(startYear,thisYear): 16: YEARS.append(year) 17: return YEARS


Esto no está relacionado con Django; el cuerpo de su definición de clase tiene su propio espacio de nombres, y se ejecuta en el orden escrito, por lo que en este punto:

class JoinForm(forms.Form): ... YEAR = self.makeYearChoice(self,1940) # here ...

no solo el self no está definido, ¡ makeYearChoice tampoco lo es! Podría solucionar esta de dos maneras:

  1. Mueva la definición del método por encima de la configuración del atributo de clase, y llámelo directamente

    class JoinForm(forms.Form): ... def makeYearChoice(self, startYear): # define the method first ... YEAR = makeYearChoice(None,1940) # don''t have an instance, but who cares? ...

    que te deja con un método de instancia redundante una vez que se define la clase; o

  2. Conviértalo en una función independiente y solo llámalo dentro de la clase:

    def makeYearChoice(startYear): ... class JoinForm(forms.Form): ... YEAR = makeYearChoice(1940) # no fuss about self argument ...

Yo preferiría fuertemente esto último. Además, debes leer la guía de estilo ; los nombres de métodos y atributos generalmente son lowercase_with_underscores , y debe tener espacios después de las comas.