Question

J'ai ce code dans mon 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',)}))

Lorsque je tente d'extraire le code programme avec inspect elle laisse 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]:      

Cela ne semble pas être un problème avec des lignes vides. Je l'ai testé sans la ligne blanche entre les deux et j'ai mis des lignes vides supplémentaires entre autres attributs. Les résultats ne changent pas.

Toutes les idées pourquoi inspectent est de retour que la partie avant fieldsets et non toute la source de la classe?

Était-ce utile?

La solution

modifier: révisé en fonction des commentaires:

A l'intérieur inspect.getsource(forms.ContactForm) la méthode BlockFinder.tokeneater() est utilisée pour déterminer l'emplacement du bloc de ContactForm arrête. En plus d'autres, il vérifie tokenize.DEDENT, qu'il trouve juste avant fieldsets dans votre version stockée sur GitHub. La ligne ne contient qu'une coupure de ligne, donc inspect pense que le bloc en cours est terminée.

Si vous insérez 4 places, cela fonctionne pour moi. Je ne peux pas argumenter sur les raisons derrière tout cela, peut-être la performance.

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 raison pour laquelle inspect.getsource(forms) fonctionne différemment est parce que inspect dans ce cas, ne doit pas déterminer le début et la fin de la définition de classe. Il affiche simplement le fichier entier.

Autres conseils

Travaux pour moi. Je n'ai pas « de formfieldset.forms importer FieldsetMixin » dans mon code. Peut-être est à l'origine d'un problème ..

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top