2012-08-23 17 views
20

Muszę dodać dodatkowe pole do mojego modelu formularza. Moje podejście jest:Określanie widgetu dla dodatkowego pola formularza modelu (Django)

class MyForm(forms.ModelForm): 
    extra_field = forms.CharField() 
    class Meta: 
     model = MyModel 
     widgets = { 
      #Does not work 
      'extra_field': forms.Textarea(attrs={'placeholder': u'Bla bla'}), 
     } 

Ale wydaje się, że definicja widget dla extra_field na class Meta jest ignorowany, ponieważ mam gołe wejście tag zamiast textarea na szablonie. więc zastosować następne podejście:

class MyForm(forms.ModelForm): 
    #It works fine 
    extra_field = forms.CharField(widget=forms.Textarea()) 
    class Meta: 
     model = MyModel 

działa idealnie dla mnie, ale ja używany do określenia widżety dla pól formularza w class Meta deklaracji. Więc zastanawiam się:

Dlaczego moje pierwsze podejście nie działa? Co robię źle?

+0

Na pewno są na Django 1.4? Form.Meta.widgets został wprowadzony w Django 1.4. – jpic

+0

Tak. 'Wersja Django: \t 1.4' –

Odpowiedz

23

Nie ma znaczenia, czy jest to dodatkowe pole. To działa:

class FooForm(forms.ModelForm): 
    class Meta: 
     model = People 
     widgets = { 
      'name': forms.Textarea(attrs={'placeholder': u'Bla bla'}), 
     } 

tego nie robi:

class FooForm(forms.ModelForm): 
    name = forms.CharField() 

    class Meta: 
     model = People 
     widgets = { 
      'name': forms.Textarea(attrs={'placeholder': u'Bla bla'}), 
     } 

To not documented indeed, to najlepsze co mogłem znaleźć w docs, które mogą odnosić się do tego zachowania (a może nie, to po prostu najlepszy mogę znaleźć):

Jeśli wyraźnie instancji pole formularza tak, Django zakłada, że ​​chcesz całkowicie określić jego zachowanie [...] należy jawnie ustawić odpowiednie argumenty podczas deklarowania pola formularza.

Realizacja tego postępowania jest django linii// postacie models.py 219.

204   if opts.model: 
    205    # If a model is defined, extract form fields from it. 
    206    fields = fields_for_model(opts.model, opts.fields, 
    207          opts.exclude, opts.widgets, formfield_callback) 
    208    # make sure opts.fields doesn't specify an invalid field 
    209    none_model_fields = [k for k, v in fields.iteritems() if not v] 
    210    missing_fields = set(none_model_fields) - \ 
EE 211        set(declared_fields.keys()) 
    212    if missing_fields: 
    213     message = 'Unknown field(s) (%s) specified for %s' 
    214     message = message % (', '.join(missing_fields), 
    215          opts.model.__name__) 
    216     raise FieldError(message) 
    217    # Override default model fields with any custom declared ones 
    218    # (plus, include all the other declared fields). 
    219    fields.update(declared_fields) 

po linii 206 pól [ 'Nazwa'] widget jest rzeczywiście Textarea podano w Meta.widgets.

W linii 219 pola są aktualizowane za pomocą zadeklarowanych pól i pól ["nazwa"]. Widżet staje się django.forms.widgets.TextInput, który jest domyślny dla CharField.

Podobno definicje pól jawnych mają priorytet.

Dzięki za pytanie, dobrze wiedzieć, świetne pytanie.

+0

Dzięki za jasną odpowiedź. –

+0

ta odpowiedź nie działa dla mnie. może django zmienił zachowanie? –

+0

To wciąż ma działać, być może zadać kolejne pytanie? – jpic

2

I rozwiązać sytuację powyżej z następujących czynności:

class FooForm(forms.ModelForm): 
    name = forms.CharField(widget=TextArea(attrs={'placeholder': u'Bla bla'})) 
    class Meta: 
     model = People 
+0

Czy to spowoduje dodanie nazwy pola do tabeli? – tilaprimera

Powiązane problemy