Django中的多语言表单验证

2023-04-11 00:00:00 表单 验证 多语言

Django中可以使用多种方式来实现多语言表单验证,以下是其中一种常见的方式:

  1. 首先,在settings.py中设置多语言支持:
LANGUAGE_CODE = 'en-us'

USE_I18N = True

LANGUAGES = [
    ('en', _('English')),
    ('zh-hans', _('Simplified Chinese')),
]

其中,LANGUAGE_CODE是默认语言,USE_I18N表示启用多语言支持,LANGUAGES是支持的语言列表,其中的_()函数会将字符串进行翻译。

  1. 在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方法获取翻译后的错误信息。

  1. 在模板中使用语言相关的字符串:
<form>
  {% csrf_token %}
  {{ form.as_p }}
  <button type="submit">Submit</button>
</form>

在模板中,可以使用form.as_p输出表单,其中会自动翻译label等字段。

例子:

  1. 在settings.py中添加多语言相关设置。
  2. 在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
  1. 在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})
  1. 在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' %}也是获取翻译后的字符串。

相关文章