Django中的多语言表单验证
Django中可以使用多种方式来实现多语言表单验证,以下是其中一种常见的方式:
- 首先,在settings.py中设置多语言支持:
LANGUAGE_CODE = 'en-us' USE_I18N = True LANGUAGES = [ ('en', _('English')), ('zh-hans', _('Simplified Chinese')), ]
其中,LANGUAGE_CODE是默认语言,USE_I18N表示启用多语言支持,LANGUAGES是支持的语言列表,其中的_()函数会将字符串进行翻译。
- 在forms.py中定义表单,使用django.utils.translation来获取语言相关的字符串:
from django import forms from django.utils.translation import ugettext_lazy as _ class ExampleForm(forms.Form): name = forms.CharField(label=_('Name')) email = forms.EmailField(label=_('Email')) def clean_name(self): name = self.cleaned_data['name'] if len(name) < 5: raise forms.ValidationError(_('The name must be at least 5 characters long.')) return name
在表单中,使用ugettext_lazy方法获取语言相关的字符串,这样可以延迟获取字符串,避免在import时翻译出现问题。
在clean_xxx方法中,可以使用ValidationError来抛出表单验证错误,可以使用gettext_lazy方法获取翻译后的错误信息。
- 在模板中使用语言相关的字符串:
<form> {% csrf_token %} {{ form.as_p }} <button type="submit">Submit</button> </form>
在模板中,可以使用form.as_p输出表单,其中会自动翻译label等字段。
例子:
- 在settings.py中添加多语言相关设置。
- 在forms.py中添加以下代码:
from django import forms from django.utils.translation import ugettext_lazy as _ class ExampleForm(forms.Form): name = forms.CharField(label=_('Name')) email = forms.EmailField(label=_('Email')) def clean_name(self): name = self.cleaned_data['name'] if len(name) < 5: raise forms.ValidationError(_('The name must be at least 5 characters long.')) return name
- 在views.py中添加以下代码:
from django.shortcuts import render from .forms import ExampleForm def example(request): if request.method == 'POST': form = ExampleForm(request.POST) if form.is_valid(): # Do something pass else: form = ExampleForm() return render(request, 'example.html', {'form': form})
- 在example.html模板中添加以下代码:
{% extends 'base.html' %} {% block content %} <h2>{{ _('Example Form') }}</h2> <form method="post"> {% csrf_token %} {{ form.as_p }} <button type="submit">{% trans 'Submit' %}</button> </form> {% endblock %}
其中,_('Example Form')获取翻译后的字符串,{% trans 'Submit' %}也是获取翻译后的字符串。
相关文章