Frage

Ich habe diesen Code in meinem 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',)}))

Wenn ich versuche, den Code programmatisch mit inspect extrahieren läßt es aus 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]:      

Dies scheint nicht ein Problem mit Leerzeilen zu sein. Ich habe zwischendurch ohne Leerzeile getestet und ich habe zwischendurch andere Attribute zusätzliche Leerzeilen setzen. Ergebnisse ändern sich nicht.

Irgendwelche Ideen, warum inspizieren kehrt nur den Teil vor fieldsets und nicht die ganze Quelle der Klasse?

War es hilfreich?

Lösung

Bearbeiten: Revidierte basierend auf Kommentare:

Innerhalb inspect.getsource(forms.ContactForm) wird das Verfahren BlockFinder.tokeneater() verwendet, um zu bestimmen, wo der ContactForm Block stoppt. Neben anderen, überprüft es für tokenize.DEDENT, die es unmittelbar vor einem Fieldset in Ihrer Version auf GitHub gespeichert findet. Die Zeile enthält nur einen Zeilenumbruch, so inspect denkt, dass der aktuelle Block beendet ist.

Wenn Sie 4 Leerzeichen einfügen, funktioniert es wieder für mich. Ich kann nicht auf die Logik dahinter argumentieren, vielleicht Leistung.

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',)}))

Der Grund, dass inspect.getsource(forms) funktioniert anders ist, weil inspect in diesem Fall nicht die Klassendefinition der Start- und Ziel zu bestimmen hat. Es gibt einfach die ganze Datei.

Andere Tipps

Funktioniert für mich. Ich habe nicht in meinem Code „von formfieldset.forms FieldsetMixin importieren“. Vielleicht ein Problem, das verursacht ..

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top