python - 에러 - 장고 CharField에 자리 표시자를 어떻게 추가합니까?




python manage.py migrate 에러 (4)

예를 들어이 간단한 형태를 취하십시오.

class SearchForm(Form):
   q = forms.CharField(label='search')

이것은 템플릿에서 렌더링됩니다.

<input type="text" name="q" id="id_q" />

그러나이 필드에 "placeholder"속성을 "Search"값과 함께 추가하여 HTML이 다음과 같이 보이도록하려고합니다.

<input type="text" name="q" id="id_q" placeholder="Search" />

가급적 나는 자리 표시 자 값을 사전이나 같은 것을 통해 폼 클래스의 CharField에 전달하고 싶습니다.

q = forms.CharField(label='search', placeholder='Search')

이것을 달성하는 가장 좋은 방법은 무엇입니까?


ModelForm의 경우 Meta 클래스를 사용할 수 있습니다.

from django import forms

from .models import MyModel

class MyModelForm(forms.ModelForm):
    class Meta:
        model = MyModel
        widgets = {
            'name': forms.TextInput(attrs={'placeholder': 'Name'}),
            'description': forms.Textarea(
                attrs={'placeholder': 'Enter description here'}),
        }

다른 방법은 모두 좋습니다. 그러나 필드를 지정하지 않으려는 경우 (예 : 일부 동적 메서드의 경우) 다음을 사용할 수 있습니다.

def __init__(self, *args, **kwargs):
    super(MyForm, self).__init__(*args, **kwargs)
    self.fields['email'].widget.attrs['placeholder'] = self.fields['email'].label or '[email protected]'

또한 개체 틀은 인스턴스가 지정된 ModelForms의 인스턴스에 의존 할 수 있습니다.


좋은 질문입니다. 내가 아는 세 가지 해결책이 있습니다.

해결책 # 1

기본 위젯을 바꿉니다.

class SearchForm(forms.Form):  
    q = forms.CharField(
            label='Search',
            widget=forms.TextInput(attrs={'placeholder': 'Search'})
        )

해결책 # 2

기본 위젯을 사용자 정의하십시오. 필드에서 일반적으로 사용하는 것과 동일한 위젯을 사용하는 경우 완전히 새로운 인스턴스를 만드는 대신 해당 필드를 사용자 정의하기 만하면됩니다.

class SearchForm(forms.Form):  
    q = forms.CharField(label='Search')

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['q'].widget.attrs.update({'placeholder': 'Search'})

해결책 # 3

마지막으로 모델 양식으로 작업하는 경우 ( 앞의 두 가지 솔루션 과 함께) 내부 Meta 클래스의 widgets 속성을 설정하여 필드에 대한 사용자 정의 위젯을 지정할 수 있습니다.

class CommentForm(forms.ModelForm):  
    class Meta:
        model = Comment
        widgets = {
            'body': forms.Textarea(attrs={'cols': 80, 'rows': 20})
        }

위젯 문서를보십시오 . 기본적으로 다음과 같이 보입니다.

q = forms.CharField(label='search', 
                    widget=forms.TextInput(attrs={'placeholder': 'Search'}))

글쓰기가 더 많습니다. 그렇지만이 분리는 더 복잡한 경우의 더 나은 추상화를 허용합니다.

또한 <field name> => <widget instance> 포함하는 widgets 속성을 ModelForm 하위 클래스의 Meta 에 직접 선언 할 수 있습니다.





django-forms