考虑到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字段,在选择标记中呈现。
答案 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替换。