0

을 사용하는 방법을 장고. 내 models.py 내 app 폴더에 templatetags 폴더를 만들었습니다. 또한 빈 inint .py 파일을 templatetags 폴더에 만들어 저장했습니다. 그런 다음 템플릿 태그 폴더에 getattribute.py라는 파일을 만들고 위 링크에서 찾은 스 니펫을 getattribute.py 파일에 복사하여 붙여 저장했습니다.그래서 내가 장고 템플릿에서 (이 링크에 있음)이 getAttribute를 기능 <a href="https://snipt.net/Fotinakis/django-template-tag-for-dynamic-attribute-lookups/" rel="nofollow">https://snipt.net/Fotinakis/django-template-tag-for-dynamic-attribute-lookups/</a></p> <p>를 사용하려면 템플릿 태그

이 내 템플릿 모습입니다 :

<html> 
    <body> 
     <form method="post" action="">{% csrf_token %} 
      {{ form.first_name }} {{form.last_name }} <br> 
      {{ form.username }} {{ form.password }} <br> 
      <input type="submit" value="Register"/> 
     </form> 

{% load getattribute %} 

{% for field, error in form.errors.items %} 
    {% if forloop.counter == 1 %} 
     {% with field_obj=form|getattribute:field %} 
      {{ field_obj.label }}{{ error | striptags }} 
     {% endwith %} 
    {% endif %} 
{% endfor %} 
</body> 
</html> 

내 models.py 보이는 방법이있다.

class Users(models.Model): 
    alpha_field = RegexValidator(regex=r'^[a-zA-Z]+$', message='Name can only contain letters') 
    user_id = models.AutoField(unique=True, primary_key=True) 
    username = models.SlugField(max_length=50, unique=True) 
    first_name = models.CharField(max_length=50, verbose_name='first Name', validators=[alpha_field]) 
    last_name = models.CharField(max_length=50, validators=[alpha_field]) 
    password = models.SlugField(max_length=50) 

내 forms.py는 this입니다.

class UsersForm(forms.ModelForm): 

    class Meta: 
     model = Users 
     widgets = {'password':forms.PasswordInput()} 

    def __init__(self, *args, **kwargs): 
     super(UsersForm, self).__init__(*args, **kwargs) 
     self.fields[ 'username' ].widget.attrs[ 'placeholder' ]="Username" 
     self.fields[ 'first_name' ].widget.attrs[ 'placeholder' ]="First Name" 
     self.fields[ 'last_name' ].widget.attrs[ 'placeholder' ]="Last Name" 
     self.fields[ 'password' ].widget.attrs[ 'placeholder' ]="Password" 
     self.fields['first_name'].label='first Name' 

는이 내가 서버를 실행하면, 형태가 오류없이 표시되고, 이제 내 views.py

def home_page(request): 
    form = UsersForm() 
    if request.method == "POST": 
     form = UsersForm(request.POST) 

     if form.is_valid(): 
      form.save() 
    c = {} 
    c.update(csrf(request)) 
    c.update({'form':form}) 
    return render_to_response('home_page.html', c) 

입니다. 그러나 의도적으로 이름 섹션을 작성하지 않고 제출을 누르면 '이 입력란은 필수 입력란입니다.'라고 표시됩니다. 자세한 이름을 말하면 스 니펫은 템플릿에 {{field_obj.label}}을 사용하는 경우 자세한 이름을 말하도록되어 있습니다. 그러나 어떤 이유에서든 자세한 이름을 표시하지는 않습니다. templatetags를 제대로 사용하지 않기 때문에 짐작할 수 있습니다.

def clean(self): 
    first_name = self.cleaned_data.get('first_name') 

    if password is None: 
     raise forms.ValidationError('This is a custom error message.') 

    return self.cleaned_data 

그런 다음, 템플릿, 당신은 같은 코드를 가질 수 있습니다 : 양식에서

답변

1

, 그것은 깨끗한 방법을하는 데 도움이 될 수 있습니다

{{ form.first_name }} 
    {% if form.first_name.errors %} 
     &nbsp;{{form.first_name.errors.as_text}} 
    {% endif %} 

그렇지 않으면

, 장고의 기본 양식 유효성 검사는 것이다 필요한 모든 입력을 처리하고 해당 일반 메시지를 제공하십시오.

또 다른 옵션은 문서에서 양식 필드 레벨에서 오류 메시지를 정의하는 것입니다 : https://docs.djangoproject.com/en/dev/ref/forms/fields/

name = forms.CharField(error_messages={'required': 'Please enter your name'}) 

이것은 귀하의 경우 오류의 유형에 따라 사용자 지정 오류 메시지를, 그래서 추가합니다, 당신은 할 수 다음과 같은 것을 사용하십시오 :

first_name = models.CharField(max_length=50, verbose_name='first Name', validators=[alpha_field], error_messages={'required': 'Please enter a first name'}) 
+0

음, 재미 있습니다. 괜찮 감사. 'self.cleaned_data.get ('first_name ') 행과 self.cleaned_data 리턴 행은 어쨌든 어떻게됩니까? – user2817200

+0

보기에서 form.is_valid()를 호출하면 request.POST의 데이터를보고 양식에 바인딩합니다. https://docs.djangoproject.com/en/dev/ref/forms/validation/ 에서 양식을 읽으십시오. form.is_valid() – james

+0

form.is_valid()를 호출 할 때보기에서 데이터를 봅니다. 귀하의 요청에. 포스 및 양식에 바인딩합니다. 문서를 통해 읽기 : https://docs.djangoproject.com/en/dev/ref/forms/validation/ form.is_valid() 메소드는 기본적으로 양식 유효성 검사를 수행합니다 (양식에 유효성 검사기가있는 경우). 필드), self.cleaned_data는 기본적으로 유효성이 검사 된 필드입니다. 우리가 self.cleaned_data를 반환하는 이유는 - 나는 django 1.5를 사용했다. 어떤 이유로 form.clean()은 정리 된 항목의 사전을 반환해야했다.개발 버전은 그 요구 사항을 제거한 것 같습니다. – james

관련 문제