0

所以我想利用這個功能的getAttribute(此鏈接上找到)https://snipt.net/Fotinakis/django-template-tag-for-dynamic-attribute-lookups/的Django如何使用模板標籤

在我的Django模板。我在我的models.py所在的應用程序文件夾中創建了一個templatetags文件夾。我還在templatetags文件夾中創建並保存了一個空的inint .py文件。然後,我在模板標籤文件夾中創建了一個名爲getattribute.py的文件,並將上面鏈接中找到的代碼段複製粘貼到getattribute.py文件中並保存該文件。

這是我的模板的樣子:

<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就是這樣。

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}},對不對?但是由於某種原因它沒有顯示詳細的名稱。我猜這是因爲我沒有正確使用模板標籤?

回答

1

在您的形式,它可以幫助有一個乾淨的方法:

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 

然後,在你的模板,你可以有這樣的代碼:

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

否則,Django默認的形式審定會根據需要處理所有輸入,並提供該通用消息。

另一種選擇,從文檔,在表單字段級定義錯誤消息: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()的視圖中,它會查看數據在你的request.POST並綁定到你的表單。通過文檔閱讀: https://docs.djangoproject.com/en/dev/ref/forms/validation/ form.is_valid()方法基本上做表單驗證(如果您的表單上有任何驗證器字段)和self.cleaned_data基本上是您驗證的字段。 至於爲什麼我們返回self.cleaned_data - 我一直在使用django 1.5,由於某種原因需要form.clean()返回一個清理項目的字典。開發版本似乎刪除了這一要求。 – james