Domanda

Ho questo codice nel mio 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',)}))

Quando si tenta di estrarre il codice di programmazione con inspect lascia fuori 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]:      

Questo non sembra essere un problema con righe vuote. Ho provato senza la riga vuota in mezzo e ho messo le ulteriori righe vuote tra gli altri attributi. I risultati non cambiano.

Tutte le idee perché controllano sta tornando solo la parte prima fieldsets e non tutta la fonte della classe?

È stato utile?

Soluzione

modifica: Revised sulla base di commenti:

All'interno inspect.getsource(forms.ContactForm) metodo BlockFinder.tokeneater() viene utilizzato per determinare dove il blocco ContactForm ferma. Inoltre altri, verifica la presenza di tokenize.DEDENT, che si trova a destra prima fieldsets nella versione conservati a github. La linea contiene solo un'interruzione di linea, in modo da inspect pensa che il blocco corrente è terminata.

Se si inserisce 4 spazi, funziona per me. Non posso discutere sulla logica alla base di questo, forse le prestazioni.

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 ragione per cui inspect.getsource(forms) funziona in modo diverso è perché inspect in quel caso non ha bisogno di stabilire inizio e la fine della definizione della classe. Emette semplicemente l'intero file.

Altri suggerimenti

funziona per me. Non ho "dal formfieldset.forms import FieldsetMixin" nel mio codice. Forse che sta causando un problema ..

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top