如何将I18N应用于Django中CheckboxSelectMultiple的标签?

时间:2017-02-13 00:59:39

标签: django django-forms django-i18n

考虑到Django应用程序,我必须将I18N应用于存储在“Area”表中的值。字段 i18n_code 的值指向我的语言环境/ 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()

如果你帮助我使用这个cenario,将帮助我拥有的另一个,我在CharField中有选择和ForeignKey字段,在选择标记中呈现。

2 个答案:

答案 0 :(得分:0)

我相信这会解决你的问题。

{% for area in form.fields.areas.queryset %}
    <div class="checkbox">
        {% trans area.i18n_code %}
    </div>
{% endfor %}

答案 1 :(得分:0)

在Blackeagle52的帮助下,我正在回答我的问题,向您展示我的解决方案! (我在想......就像在2004年编写 PHP ASP

对于具有 queryset 和小部件 CheckBoxSelectMultiple 的字段:

<link>

对于具有选项参数(2个值的元组)和小部件选择的字段:

{% 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 %}

在这两种情况下,如果需要,只需通过选项更改 queryset ,并使用您要渲染的模型属性(例如name,i18n_code,slug ...)。对于像<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> 这样的元组,模型属性将在声明的var in for语句的名称之后被.0或.1替换。