如何将 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 年编程 PHPASP

对于具有 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。