2017-02-13 8 views
0

Django 응용 프로그램을 고려하여 "Area"테이블에 저장된 값에 I18N을 적용해야합니다. 필드 값이 인 경우 i18n_code을 가리 킵니다. 내 로케일/en_US/LC_MESSAGES/django.po에 msgid 항목이 있습니다.Django에서 CheckboxSelectMultiple의 레이블에 I18N을 적용하려면 어떻게해야합니까?

내 코드에서 알 수 있듯이 시동 모델에는 Area의 ManyToMany 필드가 있습니다. 내 양식에서 영역은 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 

<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

form01.html
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

나는 이것이 귀하의 문제를 해결할 것이라고 믿습니다.

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

고마워 Blackeagle52! 당신은 정말로 내 문제를 해결했습니다! 나는 더 많은 코드를 써야 할 것이다. 그러나 나는 그것 위에 도메인을 가지고있다. 더 다루기 쉬운 뭔가를 만들고 싶습니다. 위젯을 만들거나 비슷한 것을 만들어야합니다. 지금은 당신의 솔루션을 사용하겠습니다. ModelForm 클래스 내부에 뭔가가 있다면 ... 여기에 게시 할 것입니다! – lordshark

0

Blackeagle52 도움 후 나의 해결책을 보여주기 위해 제 질문에 대답하고 있습니다!

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

필드 : 의 검색어 및 위젯 CheckBoxSelectMultiple이 필드의

(나는 생각했다 ... 그것은 PHP 또는 다시 2004 년 ASP를 프로그래밍을 같이했다) 있는 선택 사항 매개 변수 (2 값의 튜플) 및 위젯 :

을 선택하십시오. (210) 두 경우 모두
<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> 

, 필요한 경우, 단지 의 검색어를 변경에 의해 선택 및 사용자 모델의 특성 (예를 들어, 이름, i18n_code, 슬러그 ...). [('1', 'One'), ('2', 'Two'), ('3', 'Three')]과 같은 튜플의 경우 모델 속성은 for 문에 선언 된 var의 이름 뒤에 .0 또는 .1로 바뀝니다.

+0

사실, 이렇게하면 선택 사항을 반복 할 수 있습니다. 가독성을 위해'값어치로, 레이블에 ... '할 수 있습니다. int. vs 문자열과 같은 이상한 것들이있을 수 있으므로'.value'도주의하십시오. – Blackeagle52