0

私は私の中にこのコードを持っています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',)}))

プログラムでコードを抽出しようとすると、inspect除外され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]:      

これは空白行の問題ではないようです。間に空白行を入れずにテストし、他の属性の間に追加の空白行を入れました。結果は変わりません。

inspect がfieldsetsクラスのソース全体ではなく、前の部分のみを返す理由はありますか?

4

2 に答える 2

1

編集:コメントに基づいて改訂:

inspect.getsource(forms.ContactForm)メソッド内で、ブロックが停止BlockFinder.tokeneater()する場所を決定するために使用されます。ContactForm他のものに加えてtokenize.DEDENT、github に保存されているバージョンのフィールドセットの直前にある をチェックします。行には改行のみが含まれているためinspect、現在のブロックが終了したと見なされます。

4つのスペースを挿入すると、再び機能します。この背後にある理論的根拠、おそらくパフォーマンスについて議論することはできません。

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

inspect.getsource(forms)動作が異なる理由inspectは、その場合、クラス定義の開始と終了を決定する必要がないためです。ファイル全体を出力するだけです。

于 2009-05-30T10:47:17.170 に答える
0

私のために働きます。コードに「from formfieldset.forms import FieldsetMixin」がありません。多分それは問題を引き起こしています..

于 2009-05-30T11:54:59.013 に答える