django 불러오기 - 장고 템플릿:선택의 상세한 버전




for문 함수 (7)

노아의 대답에 기초하여, 선택지가없는 들판에 면역 된 버전이 있습니다 :

#annoyances/templatetags/data_verbose.py
from django import template

register = template.Library()

@register.filter
def data_verbose(boundField):
    """
    Returns field's data or it's verbose version 
    for a field with choices defined.

    Usage::

        {% load data_verbose %}
        {{form.some_field|data_verbose}}
    """
    data = boundField.data
    field = boundField.field
    return hasattr(field, 'choices') and dict(field.choices).get(data,'') or data

나는 그런 목적으로 필터를 사용하는 것이 더 낫지는 않다. 아무나 더 나은 해결책이 있다면, 나는 그것을 보니 다행 이네. :) 노아 감사합니다!

모델이 있습니다.

from django.db import models

CHOICES = (
    ('s', 'Glorious spam'),
    ('e', 'Fabulous eggs'),
)

class MealOrder(models.Model):
    meal = models.CharField(max_length=8, choices=CHOICES)

나는 형식을 가지고있다 :

from django.forms import ModelForm

class MealOrderForm(ModelForm):
    class Meta:
        model = MealOrder

formtools.preview를 사용하고 싶습니다. 기본 서식 파일은 짧은 버전의 '멋진 달걀'대신 'e'를 인쇄합니다.

{% for field in form %}
<tr>
<th>{{ field.label }}:</th>
<td>{{ field.data }}</td>
</tr>
{% endfor %}.

언급 한대로 일반적인 템플릿을 원하지만 '멋진 계란'을 대신 인쇄하십시오.

[내가 진짜 질문이 어디 있는지 의문을 품은 것처럼 나는 우리 모두를 대담하게 만들었다.]]

나는 그 자체가 추악한 방식으로 선택의 장황한 버전을 얻는 방법을 안다.

{{ form.meal.field.choices.1.1 }}

실제 고통은 내가 선택한 선택을 얻는 것이고, 내 마음에 오는 유일한 길은 선택을 통해 반복하고 {% ifequals currentChoice.0 choiceField.data %} 검사하는 {% ifequals currentChoice.0 choiceField.data %} , 이것은 더 끔찍한 것이다.

그것을 쉽게 할 수 있습니까? 아니면 템플릿 태그 프로그래밍이 필요합니까? 이미 장고에서 사용할 수 있어야합니까?


문제를 해결하는 가장 좋은 방법은 도우미 함수를 사용하는 것입니다. 선택 사항이 변수 CHOICES에 저장되고 선택된 선택 항목을 저장하는 모델 필드가 ' 선택 사항 '이면 직접 사용할 수 있습니다

 {{ x.get_choices_display }}

귀하의 템플릿에. 여기서 x는 모델 인스턴스입니다. 희망이 도움이됩니다.


내가 할 수있는 기본 방법이 없다고 생각합니다. 필터가 트릭을 수행 할 수도 있습니다.

@register.filter(name='display')
def display_value(bf):
    """Returns the display value of a BoundField"""
    return dict(bf.field.choices).get(bf.data, '')

그럼 당신은 할 수 있습니다 :

{% for field in form %}
    <tr>
        <th>{{ field.label }}:</th>
        <td>{{ field.data|display }}</td>
    </tr>
{% endfor %}

Noah 의 필터 솔루션을 확장하여 데이터 및 필드 유형을보다 보편적으로 처리 할 수 ​​있습니다.

<table>
{% for item in query %}
    <tr>
        {% for field in fields %}
            <td>{{item|human_readable:field}}</td>
        {% endfor %}
    </tr>
{% endfor %}
</table>

코드는 다음과 같습니다.

#app_name/templatetags/custom_tags.py
def human_readable(value, arg):
    if hasattr(value, 'get_' + str(arg) + '_display'):
        return getattr(value, 'get_%s_display' % arg)()
    elif hasattr(value, str(arg)):
        if callable(getattr(value, str(arg))):
            return getattr(value, arg)()
        else:
            return getattr(value, arg)
   else:
       try:
           return value[arg]
       except KeyError:
           return settings.TEMPLATE_STRING_IF_INVALID
register.filter('human_readable', human_readable)

이 답변이 위에 열거 된 목록 중 일부와 중복되는 경우 사과드립니다. 그러나 아직 제공되지 않았으며 상당히 깨끗해 보입니다. 다음은이 문제를 해결 한 방법입니다.

from django.db import models

class Scoop(models.Model):
    FLAVOR_CHOICES = [
        ('c', 'Chocolate'),
        ('v', 'Vanilla'),
    ]

    flavor = models.CharField(choices=FLAVOR_CHOICES)

    def flavor_verbose(self):
        return dict(Scoop.FLAVOR_CHOCIES)[self.flavor]

내보기 템플릿 (노트 : Scoop.values ​​()) 아닙니다 , 및 서식 파일에 포함 된 Scoop 전달합니다 :

{{ scoop.flavor_verbose }}

Django 템플릿에서 " get_FOO_display() "메서드를 사용하면 필드의 읽을 수있는 별칭을 반환 할 수 있습니다. 여기서 'FOO'는 필드의 이름입니다.

참고 : 표준 FormPreview 템플릿에서 사용하지 않는 경우 {{ form.get_meal_display }} 와 같은 형식 의 템플릿제공 할 수 있습니다.


Django 1.9 이후, 더 이상 다른 언급 된 것처럼 common 응용 프로그램을 만들 필요가 없습니다. 프로젝트 templatetags 디렉토리의 경로를 settings.pyOPTION['libraries'] dict에 추가하기 만하면됩니다.

그 후에,이 태그는 전체 프로젝트에서 액세스 할 수 있습니다. templatetags 폴더는 필요할 때마다 배치 할 수 있으며 다른 이름을 가질 수도 있습니다.

Django 문서의 사용자 정의 된 예 :

OPTIONS={
    'libraries': {
        'myapp_tags': 'path.to.myapp.tags',
        'project_tags': 'project.templatetags.common_extras',
        'admin.urls': 'django.contrib.admin.templatetags.admin_urls',
    },
}




django django-templates django-forms