Pregunta

Tengo este código en mi forms.py:

from django import forms
from formfieldset.forms import FieldsetMixin


class ContactForm(forms.Form, FieldsetMixin):
    full_name = forms.CharField(max_length=120)
    email = forms.EmailField()
    website = forms.URLField()
    message = forms.CharField(max_length=500, widget=forms.Textarea)
    send_notification = forms.BooleanField(required=False)

    fieldsets = ((u'Personal Information',
                {'fields': ('full_name', 'email', 'website'),
                'description': u'Your personal information will not ' \
                                u'be shared with 3rd parties.'}),
                (None,
                {'fields': ('message',),
                'description': u'All HTML will be stripped out.'}),
                (u'Preferences',
                {'fields': ('send_notification',)}))

Cuando intento para extraer el código de programación con inspect que deja fuera fieldsets:

In [1]: import inspect

In [2]: import forms

In [3]: print inspect.getsource(forms)
from django import forms
from formfieldset.forms import FieldsetMixin


class ContactForm(forms.Form, FieldsetMixin):
    full_name = forms.CharField(max_length=120)
    email = forms.EmailField()
    website = forms.URLField()
    message = forms.CharField(max_length=500, widget=forms.Textarea)
    send_notification = forms.BooleanField(required=False)

    fieldsets = ((u'Personal Information',
                {'fields': ('full_name', 'email', 'website'),
                'description': u'Your personal information will not ' \
                                u'be shared with 3rd parties.'}),
                (None,
                {'fields': ('message',),
                'description': u'All HTML will be stripped out.'}),
                (u'Preferences',
                {'fields': ('send_notification',)}))

In [4]: print inspect.getsource(forms.ContactForm)
class ContactForm(forms.Form, FieldsetMixin):
    full_name = forms.CharField(max_length=120)
    email = forms.EmailField()
    website = forms.URLField()
    message = forms.CharField(max_length=500, widget=forms.Textarea)
    send_notification = forms.BooleanField(required=False)


In [5]:      

Esto no parece ser un problema con las líneas en blanco. He probado sin la línea en blanco en el medio y le he puesto las líneas en blanco adicionales entre otros atributos. Los resultados no cambian.

Cualquier idea por qué inspeccionan está regresando sólo la parte antes fieldsets y no toda la fuente de la clase?

¿Fue útil?

Solución

editar: revisado basado en los comentarios:

Dentro inspect.getsource(forms.ContactForm) la BlockFinder.tokeneater() método se utiliza para determinar donde se detiene el bloque ContactForm. Además de otros, comprueba tokenize.DEDENT, que se encuentra justo antes de conjuntos de campos en la versión almacenada en GitHub. La línea contiene sólo un salto de línea, por lo inspect piensa que el bloque actual ha terminado.

Si inserta 4 espacios, funciona para mí otra vez. No puedo discutir sobre las razones detrás de esto, tal vez el rendimiento.

class ContactForm(forms.Form):
    full_name = forms.CharField(max_length=120)
    email = forms.EmailField()
    website = forms.URLField()
    message = forms.CharField(max_length=500, widget=forms.Textarea)
    send_notification = forms.BooleanField(required=False)
    # <-- insert 4 spaces here
    fieldsets = ((u'Personal Information',
                {'fields': ('full_name', 'email', 'website'),
                'description': u'Your personal information will not ' \
                                u'be shared with 3rd parties.'}),
                (None,
                {'fields': ('message',),
                'description': u'All HTML will be stripped out.'}),
                (u'Preferences',
                {'fields': ('send_notification',)}))

La razón de que inspect.getsource(forms) funciona de forma diferente es porque inspect en ese caso no tiene que determinar inicio y el final de la definición de clase. Simplemente se da salida a todo el archivo.

Otros consejos

A mí me funciona. No tengo "de formfieldset.forms importar FieldsetMixin" en mi código. Tal vez lo que está causando un problema ..

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top