如何将 I18N 应用于 Django 中 CheckboxSelectMultiple 的标签?
How can I apply I18N to the labels of a CheckboxSelectMultiple in Django?
考虑到 Django 应用程序,我必须将 I18N 应用于存储在 "Area" table 中的值。 i18n_code 字段的值指向我的 locale/en_US/LC_MESSAGES/django.po.
中的 msgid 条目
如您在我的代码中所见,Startup 模型具有 Area 的 ManyToMany 字段。在我的表单中,area 是一个 CheckboxSelectMultiple 小部件。我如何才能在我的 form01.html(模板)中获取 i18n_code,然后传递给 {% trans area.i18n_code %}
,以便我能够以正确的语言呈现选项?
我检查了很多与这个主题相关的问题...但我没有得到一些干净的解决方案。
检查代码:
models.py:
@python_2_unicode_compatible
class Area (models.Model):
name = models.CharField(max_length = 200)
i18n_code = models.CharField(max_length = 200)
def __str__(self):
return self.name
@python_2_unicode_compatible
class Startup (models.Model):
name = models.CharField(max_length = 200)
# ...
areas = models.ManyToManyField(Area, verbose_name = 'Areas')
def __str__(self):
return self.name
form01.html
<div class="row linhaForm">
<div class="col-lg-4 legenda">
<b>{% trans 'FORM_1_LABEL_AREA' %}</b>
<p>{% trans 'FORM_1_LABEL_AREA_DESCRIPTION' %}</p>
</div>
<div class="col-lg-8">
{% for area in form.areas %}
<div class="checkbox">
{{area}} <-------------------- Here is my problem!
</div>
{% endfor %}
</div>
</div>
forms.py
from django.utils.translation import ugettext_lazy as _
class Step1Form(forms.ModelForm):
class Meta:
model = models.Startup
fields = ['name', 'areas']
widgets = {
'areas': forms.CheckboxSelectMultiple(attrs={'onclick':'onAreaCheckHandler()'}),
'name': forms.TextInput(attrs={'class': 'form-control'}),
}
error_messages = {
'name': {
'required': _("FORM_1_ERROR_NAME_REQUIRED")
},
'areas': {
'required': _("FORM_1_ERROR_AREA_REQUIRED")
}
}
def __init__(self, *args, **kwargs):
super(Step1Form, self).__init__(*args, **kwargs)
if self.instance:
self.fields['areas'].queryset = models.Area.objects.all()
如果你帮我解决这个问题,也会帮助我解决另一个问题,在那里我得到了带有选项的 CharField 和 ForeignKey 字段,在 Select[=38= 中呈现] 标签。
我相信这会解决您的问题。
{% for area in form.fields.areas.queryset %}
<div class="checkbox">
{% trans area.i18n_code %}
</div>
{% endfor %}
在Blackeagle52的帮助下,我正在回答我的问题,向您展示我的解决方案!
(我在想...这就像在 2004 年编程 PHP 或 ASP)
对于具有 queryset 和小部件 CheckBoxSelectMultiple 的字段:
{% for area in form.fields.areas.queryset %}
<div class="checkbox">
<label for="id_areas_{{area.id}}">
<input id="id_areas_{{area.id}}" name="areas" type="checkbox" value="{{area.id}}" {% if area.id in form.areas.value %} checked="checked" {% endif %}>
{% trans area.i18n_code %}
</label>
</div>
{% endfor %}
对于具有 选择 参数(2 个值的元组)和小部件 Select:
的字段
<select class="form-control" id="id_type_register" name="type_register">
{% for type in form.fields.type_register.choices %}
<option value="{{type.0}}" {% if type.0 == form.type_register.value %} selected="selected" {% endif %}>
{% trans type.1 %}
</option>
{% endfor %}
</select>
在这两种情况下,如果需要,只需将 queryset 更改为 choices 并使用您的模型属性(例如名称,i18n_code, slug...) 被渲染。对于像 [('1', 'One'), ('2', 'Two'), ('3', 'Three')]
这样的元组,模型属性将在 for 语句中声明的变量名称后替换为 .0 或 .1。
考虑到 Django 应用程序,我必须将 I18N 应用于存储在 "Area" table 中的值。 i18n_code 字段的值指向我的 locale/en_US/LC_MESSAGES/django.po.
中的 msgid 条目如您在我的代码中所见,Startup 模型具有 Area 的 ManyToMany 字段。在我的表单中,area 是一个 CheckboxSelectMultiple 小部件。我如何才能在我的 form01.html(模板)中获取 i18n_code,然后传递给 {% trans area.i18n_code %}
,以便我能够以正确的语言呈现选项?
我检查了很多与这个主题相关的问题...但我没有得到一些干净的解决方案。
检查代码:
models.py:
@python_2_unicode_compatible
class Area (models.Model):
name = models.CharField(max_length = 200)
i18n_code = models.CharField(max_length = 200)
def __str__(self):
return self.name
@python_2_unicode_compatible
class Startup (models.Model):
name = models.CharField(max_length = 200)
# ...
areas = models.ManyToManyField(Area, verbose_name = 'Areas')
def __str__(self):
return self.name
form01.html
<div class="row linhaForm">
<div class="col-lg-4 legenda">
<b>{% trans 'FORM_1_LABEL_AREA' %}</b>
<p>{% trans 'FORM_1_LABEL_AREA_DESCRIPTION' %}</p>
</div>
<div class="col-lg-8">
{% for area in form.areas %}
<div class="checkbox">
{{area}} <-------------------- Here is my problem!
</div>
{% endfor %}
</div>
</div>
forms.py
from django.utils.translation import ugettext_lazy as _
class Step1Form(forms.ModelForm):
class Meta:
model = models.Startup
fields = ['name', 'areas']
widgets = {
'areas': forms.CheckboxSelectMultiple(attrs={'onclick':'onAreaCheckHandler()'}),
'name': forms.TextInput(attrs={'class': 'form-control'}),
}
error_messages = {
'name': {
'required': _("FORM_1_ERROR_NAME_REQUIRED")
},
'areas': {
'required': _("FORM_1_ERROR_AREA_REQUIRED")
}
}
def __init__(self, *args, **kwargs):
super(Step1Form, self).__init__(*args, **kwargs)
if self.instance:
self.fields['areas'].queryset = models.Area.objects.all()
如果你帮我解决这个问题,也会帮助我解决另一个问题,在那里我得到了带有选项的 CharField 和 ForeignKey 字段,在 Select[=38= 中呈现] 标签。
我相信这会解决您的问题。
{% for area in form.fields.areas.queryset %}
<div class="checkbox">
{% trans area.i18n_code %}
</div>
{% endfor %}
在Blackeagle52的帮助下,我正在回答我的问题,向您展示我的解决方案! (我在想...这就像在 2004 年编程 PHP 或 ASP)
对于具有 queryset 和小部件 CheckBoxSelectMultiple 的字段:
{% for area in form.fields.areas.queryset %}
<div class="checkbox">
<label for="id_areas_{{area.id}}">
<input id="id_areas_{{area.id}}" name="areas" type="checkbox" value="{{area.id}}" {% if area.id in form.areas.value %} checked="checked" {% endif %}>
{% trans area.i18n_code %}
</label>
</div>
{% endfor %}
对于具有 选择 参数(2 个值的元组)和小部件 Select:
的字段<select class="form-control" id="id_type_register" name="type_register">
{% for type in form.fields.type_register.choices %}
<option value="{{type.0}}" {% if type.0 == form.type_register.value %} selected="selected" {% endif %}>
{% trans type.1 %}
</option>
{% endfor %}
</select>
在这两种情况下,如果需要,只需将 queryset 更改为 choices 并使用您的模型属性(例如名称,i18n_code, slug...) 被渲染。对于像 [('1', 'One'), ('2', 'Two'), ('3', 'Three')]
这样的元组,模型属性将在 for 语句中声明的变量名称后替换为 .0 或 .1。