복붙노트

[PYTHON] 모델 양식 추가 필드 (Django)에 위젯 지정

PYTHON

모델 양식 추가 필드 (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'}),
        }

하지만 템플릿에 textarea가 아닌 맨손으로 입력 된 태그가 있기 때문에 class Meta의 extra_field에 대한 위젯 정의가 무시되는 것 같습니다. 그래서 다음 접근 방식을 적용합니다.

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

그것은 완벽하게 작동하지만 Meta 선언 클래스에서 양식 필드에 위짓을 사용했습니다. 그래서 궁금합니다.

왜 내 첫 번째 접근 방식이 효과가 없습니까? 내가 뭘 잘못하고 있니?

해결법

  1. ==============================

    1.그것은 여분의 필드면 중요하지 않습니다. 작동 방식 :

    그것은 여분의 필드면 중요하지 않습니다. 작동 방식 :

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

    그렇지 않습니다.

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

    이것은 실제로 문서화되지 않았습니다. 문서에서 해당 동작과 관련 될 수있는 최선의 방법이 있습니다 (그렇지 않을 수도 있습니다.)

    이 동작의 구현은 django / forms / 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)
    

    206 행 다음에 fields [ 'name']. widget은 실제로 Meta.widgets에 지정된 Textarea입니다.

    219 행에서 필드는 declared_fields 및 fields [ 'name']로 업데이트되고 widget은 CharField의 기본값 인 django.forms.widgets.TextInput이됩니다.

    분명히 명시적인 필드 정의가 우선합니다.

    좋은 질문, 좋은 질문에 감사드립니다.

  2. ==============================

    2.위의 상황을 다음과 같이 해결했습니다.

    위의 상황을 다음과 같이 해결했습니다.

    class FooForm(forms.ModelForm):
        name = forms.CharField(widget=TextArea(attrs={'placeholder': u'Bla bla'}))
        class Meta:
            model = People
    
  3. from https://stackoverflow.com/questions/12097825/specifying-widget-for-model-form-extra-field-django by cc-by-sa and MIT license