Pergunta

Eu tenho esse código no meu 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 tento extrair o código de programação com inspect deixa de fora 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]:      

Este não parece ser um problema com linhas em branco. Eu testei sem a linha em branco no meio e eu coloquei as linhas em branco adicionais entre outros atributos. Os resultados não mudam.

Todas as ideias por inspecionar está retornando apenas a parte antes fieldsets e não toda a fonte da classe?

Foi útil?

Solução

edit: revisto com base em comentários:

Dentro inspect.getsource(forms.ContactForm) o método BlockFinder.tokeneater() é usada para determinar onde o bloco ContactForm pára. Além de outros, ele verifica para tokenize.DEDENT, que se encontra bem diante fieldsets em sua versão armazenados no github. A linha contém apenas uma quebra de linha, de modo inspect acha que o bloco atual foi encerrada.

Se você inserir 4 espaços, ele trabalha para mim novamente. Eu não posso discutir sobre a lógica por trás disso, talvez o desempenho.

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

A razão que inspect.getsource(forms) funciona de forma diferente é porque inspect nesse caso não tem que determinar início da definição de classe e fim. Ele simplesmente envia o arquivo inteiro.

Outras dicas

Funciona para mim. Eu não tenho "de formfieldset.forms importar FieldsetMixin" no meu código. Talvez isso está causando um problema ..

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top