django에서 폼과 관련된 필드 및 검증기

4888 단어 -----Django
form.py
from django import forms
def words_validator(comment):
    if len(comment) < 4:
        raise ValidationError('Not Enough words')
class CommentForm(forms.Form):
    name = forms.CharField(max_length=50)
    comment = forms.CharField(
            validators = [words_validator]
            )
def password_validator(comment):
    if len(password) < 8:
        raise ValidationError('           ')
    if [0,1,2,3,4,5,6,7,8,9] in password:
        raise ValidationError('         ')

양식 바인딩
if request.method == "POST":
    data = request.POST
    form = CommentForm(data)
if request.method == 'POST':
    data = {'name':'geeklee','class':'   '}
    form = CommentForm(data)
if form.is_valid():
    name = form.cleaned_data['name']
    comment = form.cleaned_data['comment']
    c = Comment(name=name,comment=comment)
    c.save()
    return redirect(to='detail')
#             ,         cleaned_data    

1. form 클래스의 운행 순서는 init, clean,validte,save입니다. 그 중에서 clean과validate는form에 있습니다.is_valid () 방법이 선후로 호출되었습니다.(여기에 의문이 하나 남는다. 구조가 완전히 같은 두 개의form이다. 그러나 하나는 선검증 후clean이고, 다른 하나는 선clean후검증이다. 원인은 불분명하다.)여기.https://docs.djangoproject.com/en/dev/ref/forms/validation/먼저 검증을 하고 클렌징을 해주셨어요.
2.cleaned_데이터의 값 유형은 필드에 정의된 Field 유형과 일치합니다.필드가charfield를 정의하면 clean 방법이 되돌아오는 cleaned데이터에서 대응하는 필드 값은 문자형으로 ModelChoiceField로 정의되면 cleaned데이터에서 필드 값은 모델입니다.ModelMultipleChoiceField로 정의하면 cleaned데이터에서 필드 값은 모델 실례list입니다.
3. clean 등의 단계에서 발생한 예외: Exception Value: argument of type'NoneType'is not iterable.이 가능하다, ~할 수 있다,...데이터 중의 어떤 필드 값은 목록이어야 하지만 실제로는 빈 값이다.
4. ModelForm의 메타 클래스에 정의된fields의 기본 Field는 Model에 정의된 Field입니다. 변경하려면 Form 클래스에서 같은 이름의 필드로 덮어쓸 수 있습니다. 예를 들어 사용자 정의widget과 Required 속성 등입니다.필드가form에서 어떻게 사용자 정의되든cleaned데이터에 대응하는 값은 모두 모델에 정의된 필드 형식에 따라 값을 가져와야 합니다. 그렇지 않으면 검사가 통과하지 않거나 타임즈 오류가 저장되지 않습니다.
이 몇 가지를 잠시 기억하면 form은 init,save 방법을 다시 쓸 수 있고 사용자 정의 방법을 사용할 수 있습니다.만약 이 몇 가지 물건에 대해 모르면 방법을 강구하여 예를 찾아 한 번 읽으면 이해할 수 있다.
※ ※ 클랜 방법 재작성 시 리턴클렌드data ※※※
보충:5.form의 네 가지 초기화 방식 ① 실례화 원form (initial={'onefield':value}) ② 필드를 정의할 때 초기화 값인 원formfield=forms.CharField (initial=value) ③ Form 클래스를 다시 쓰는 init () 방법:self.fields[‘onefield’].initial =value ④ form에 instanse (즉 oneform (instanse = onemodel instance) 를 전참할 때, 앞의 세 가지 초기화 방법은 모두 효력을 상실합니다. init를 다시 쓸 때에도 부류의 init를 사용하고 ③를 사용하면 여전히 효력이 없습니다. (시원하지 않습니다.)이 때 필드 값을 다시 초기화하려면 init () 에서만self를 사용해야 합니다.initial ['title'] =value,Form 클래스의 initial 속성 사전에 직접 값을 부여합니다.

좋은 웹페이지 즐겨찾기