2011-10-14 12 views
5

Tengo una forma sencilla de Django, que se ve algo como esto:¿Cómo declarar un campo de formulario en Django, si tiene el mismo nombre que una palabra clave de Python?

class SearchForm(forms.Form): 
    text = forms.CharField() 
    from = forms.DateField() 
    until = forms.DateField() 

Qué falla con un SyntaxError, porque from es una palabra clave Python.

Prefiero no cambiar el nombre del campo; Se adapta mejor que cualquiera de las alternativas, y soy quisquilloso acerca de cómo le parece al usuario final. (El formulario está utilizando 'GET', por lo que el nombre del campo es visible en la URL.)

Soy consciente de que sólo podía usar algo, como from_ lugar, pero yo estaba en principio pensamos que podría haber alguna manera de proporcionar explícitamente la nombre de campo, para casos como este. (Por ejemplo, suministrando un parámetro name='whatever' en el constructor de Campo). No está disponible there isn't.

Por el momento estoy usando dynamic form generation para moverse por la cuestión, que no es tan malo, pero aún así es un poco de un truco ...

class SearchForm(forms.Form): 
    text = forms.CharField() 
    from_ = forms.DateField() 
    until = forms.DateField() 

    def __init__(self, *args, **kwargs): 
     super(SearchForm, self).__init__(*args, **kwargs) 
     self.fields['from'] = self.fields['from_'] 
     del self.fields['from_'] 

¿Hay alguna forma más elegante de tener un campo de formulario llamado from, o cualquier otra palabra clave de Python?

+0

mayúscula en la palabra? Estoy bastante seguro de que las palabras clave son solo minúsculas. – Delyan

+0

algo similar es establecer la etiqueta en __init__ ... http://stackoverflow.com/questions/636905/django-form-set-label – jcfollower

+0

La etiqueta es la descripción textual, no el parámetro de consulta que se usa, por lo que eso no hace el truco –

Respuesta

4

No nombre las cosas después de las palabras clave, incluso si encuentra una solución, probablemente terminará mordiéndolo más tarde.

Use un sinónimo o agregue un prefijo/sufijo en su lugar.

E.g.
start ->finish
begin ->end
date_from ->date_to

+7

Estoy de acuerdo si no fuera por el hecho de que hace una diferencia visible para el usuario final. Prefiero no tomar decisiones sobre cómo se verán mis URL para el usuario final en función de la semántica del lenguaje que estoy usando para el código de back-end. –

Cuestiones relacionadas