2012-04-03 46 views
7

Tôi đang cố gắng tìm cách hiển thị văn bản của giá trị đã chọn/ban đầu của trường đa lựa chọn.Django: Hiển thị giá trị của trường được chọn nhiều lựa chọn trong một mẫu

Câu hỏi của tôi cũng tương tự như cái này ngoại trừ tôi không muốn giá trị Tôi muốn văn bản tùy chọn tương ứng với nó:

Display value of a django form field in a template?

Ví dụ nếu tôi đã có một hình thức như sau :

GENDER_CHOICES = (
    ('male', _('Men')), 
    ('female', _('Women')), 
) 

genders = forms.MultipleChoiceField(choices=GENDER_CHOICES, 
    widget=widgets.CheckboxSelectMultiple(), 
    initial=[gender[0] for gender in GENDER_CHOICES]) 

sau đó trong mẫu của tôi, tôi có thể làm:

{{ form.genders.value }} 

để nhận một loạt các tùy chọn đã chọn (tức là [u'male ', u'female']. Tuy nhiên, tôi bằng cách nào đó muốn tra cứu giá trị chuỗi từ khóa (ví dụ: "Đàn ông", "Phụ nữ"), giống như:

{% for key in form.genders.value %} 
    {{ form.genders.choices.key }} 
{% endfor %} 

Tôi không thể tìm ra cách làm việc này. Làm thế nào tôi có thể đạt được điều này bằng cách sử dụng Django 1.3?

ps - Đây là một ví dụ ngắn, nhưng tôi cần phải làm điều đó với danh sách động lớn hơn mà cấm sử dụng nhiều câu lệnh if (ví dụ "nếu == chìa khóa 'nam' 'Men' ... vv")

+1

này có lẽ có thể là một cái gì đó như: '{% cho khóa trong form.genders.value%} {{ form.genders.get_key_display}} {% endfor%} 'Nhưng tôi không chắc chắn. – Mig

Trả lời

6
  1. Thêm một phương pháp để các hình thức, trả về danh sách mà bạn muốn

  2. Gọi nó từ mẫu

Nó trông như thế này:

def selected_genders_labels(self): 
    return [label for value, label in self.fields['genders'].choices if value in self['genders'].value()] 

Trong hành động:

In [1]: from testapp.views import XForm; f = XForm(initial={'genders': ['male', 'female']}); print f.selected_genders_labels() 
['Men', 'Women'] 

In [2]: from testapp.views import XForm; f = XForm(initial={'genders': ['female']}); print f.selected_genders_labels() 
['Women'] 

In [3]: from testapp.views import XForm; f = XForm(initial={'genders': []}); print f.selected_genders_labels() 
[] 

In [4]: from testapp.views import XForm; f = XForm(); print f.selected_genders_labels() 
['Men', 'Women'] 

Vì vậy, bạn chỉ có thể lặp như thế này:

{% for label in form.selected_genders_labels %}{{ label }}{% endfor %} 

FTR, tôi đã sử dụng:

class XForm(forms.Form): 
    GENDER_CHOICES = (
     ('male', 'Men'), 
     ('female', 'Women'), 
    ) 

    genders = forms.MultipleChoiceField(choices=GENDER_CHOICES, 
     widget=widgets.CheckboxSelectMultiple(), 
     initial=[gender[0] for gender in GENDER_CHOICES]) 

    def selected_genders_labels(self): 
     return [label for value, label in self.fields['genders'].choices if value in self['genders'].value()] 

Bạn có thể làm suc ha mẫu lọc:

@register.filter 
def selected_labels(form, field): 
    return [label for value, label in form.fields[field].choices if value in form[field].value()] 

Cách sử dụng:

{% for label in form|selcted_labels:"genders" %} 
    {{ label }} 
{% endfor %} 
+0

Cảm ơn bạn đã trả lời. Có cách nào tôi có thể biến điều này thành một thẻ mẫu hay cái gì đó? Tôi đã có khá nhiều lĩnh vực tôi cần phải làm điều này và không thực sự muốn một phương pháp cho mỗi lĩnh vực ... – John

+1

Bạn nên thực hiện một bộ lọc mẫu thay vào đó, nó dễ dàng hơn nhiều. – jpic

+0

OK Tôi sẽ đi. Cảm ơn – John

Các vấn đề liên quan