所以我想使用这个getattribute函数(在此链接中找到)https://snipt.net/Fotinakis/django-template-tag-for-dynamic-attribute-lookups/
在我的django模板中。我在我的models.py所在的app文件夹中创建了一个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}},对吧?但由于某种原因,它并没有显示冗长的名称。我猜这是因为我没有正确使用模板标签?
答案 0 :(得分: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 %}
{{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'})