django如何使用模板标签
Posted
技术标签:
【中文标题】django如何使用模板标签【英文标题】:django how to use template tags 【发布时间】:2013-10-04 20:42:38 【问题描述】:所以我想使用这个 getattribute 函数(在这个链接上找到)https://snipt.net/Fotinakis/django-template-tag-for-dynamic-attribute-lookups/
在我的 Django 模板中。我在我的 models.py 所在的 app 文件夹中创建了一个 templatetags 文件夹。我还在 templatetags 文件夹中创建并保存了一个空的 inint.py 文件。然后,我在模板标签文件夹中创建了一个名为 getattribute.py 的文件,并将上面链接中的 sn-p 复制粘贴到 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'
这是我的观点.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 ,我希望它说出详细名称,并且 sn-p 应该让它说出详细名称,对吗?但由于某种原因,它不显示详细名称。我猜是因为我没有正确使用模板标签?
【问题讨论】:
【参考方案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')
【讨论】:
嗯,有趣。好的谢谢。 'self.cleaned_data.get('first_name') 行和 return self.cleaned_data 行到底做了什么? 在您的视图中,当您调用 form.is_valid() 时,它会查看您的 request.POST 中的数据并将其绑定到您的表单。阅读文档:docs.djangoproject.com/en/dev/ref/forms/validation form.is_valid() 在您的视图中,当您调用 form.is_valid() 时,它会查看您的 request.POST 中的数据并将其绑定到您的表单。阅读以下文档:docs.djangoproject.com/en/dev/ref/forms/validation form.is_valid() 方法基本上是进行表单验证(如果您的表单字段上有任何验证器),而 self.cleaned_data 基本上是您经过验证的字段。至于为什么我们返回 self.cleaned_data - 我一直在使用 django 1.5,由于某种原因需要 form.clean() 返回一个已清理项目的字典。开发版似乎已经取消了这个要求。以上是关于django如何使用模板标签的主要内容,如果未能解决你的问题,请参考以下文章
我将如何在 Django 模板标签中使用模板上下文变量的值? [复制]
如何结合 Django 内置的“with”标签使用自定义模板标签?