Django: Giá trị lựa chọn hiển thị


245

mô hình:

class Person(models.Model):
    name = models.CharField(max_length=200)
    CATEGORY_CHOICES = (
        ('M', 'Male'),
        ('F', 'Female'),
    )
    gender = models.CharField(max_length=200, choices=CATEGORY_CHOICES)
    to_be_listed = models.BooleanField(default=True)
    description = models.CharField(max_length=20000, blank=True)

lượt xem:

def index(request):
    latest_person_list2 = Person.objects.filter(to_be_listed=True)
    return object_list(request, template_name='polls/schol.html',
                       queryset=latest_person_list, paginate_by=5)

Trên mẫu, khi tôi gọi person.gender, tôi nhận được 'M'hoặc 'F'thay vì 'Male'hoặc 'Female'.

Làm cách nào để hiển thị giá trị ( 'Male'hoặc 'Female') thay vì mã ( 'M'/ 'F')?



Tôi đã thử phương pháp này, Trong mẫu của tôi, tôi đang sử dụng: {% cho người trong object_list%} một số html {{person.get_gender_display ()}} html {% endfor%} Tôi đang gặp lỗi sau: Giá trị ngoại lệ: Không thể phân tích cú pháp phần còn lại: '()' từ 'person.get_gender_display ()'
Shankze

7
Xấu của tôi, tôi không nên bao gồm '()' sau person.get_gender_display. Nó đang làm việc bây giờ. Cảm ơn.
Shankze

3
Chỉ cần một nhận xét nhỏ, vì giới tính sẽ chỉ là M hoặc F (chiều dài 1 ký tự), không có nghĩa là thiết lập độ dài tối đa của trường từ 200. Với max_lenght=1là đủ, sẽ làm cho trang web của bạn hiệu quả hơn và bạn sẽ đảm bảo rằng bạn sẽ không có dữ liệu sai. :)
Alejandro Garcia

Câu trả lời:


502

Có vẻ như bạn đã đi đúng hướng - get_FOO_display()chắc chắn là những gì bạn muốn:

Trong các mẫu , bạn không bao gồm ()tên của một phương thức. Làm như sau:

{{ person.get_gender_display }}

Phương pháp này là vô giá. Nhưng bên cạnh việc sử dụng phương thức, cách lấy lại giá trị được lưu trữ trong {{i.item.what_to_put_here}} là gì?
KhoPhi

11
Chỉ cần lưu ý, đối với bất kỳ ai sử dụng Jinja2 cho các mẫu của họ, bạn nên bao gồm các dấu ngoặc đơn. {{ person.get_gender_display() }}
adam b

1
Điểm thưởng: cách tốt nhất để làm điều này là gì nếu bạn gửi thông tin của mình qua JSON (ví dụ trong kịch bản phân trang)? Lý tưởng nhất là không có chi phí khởi tạo các Mô hình từng cái một và gọi get_field_display ().
DylanYoung

7
Gotta yêu Django, gần 10 năm sau và câu trả lời vẫn còn hiệu lực! Thx +1 và uống vào tôi.
Marc

1
Bằng cách nào đó, điều này không lấy văn bản dịch. Bất kỳ ý tưởng về làm thế nào để có được văn bản dịch nếu i18 đã được thực hiện trên trang web?
Anoop Nair

16

Đối với mọi trường có các lựa chọn được đặt, đối tượng sẽ có phương thức get_FOO_display (), trong đó FOO là tên của trường. Phương thức này trả về giá trị có thể đọc được của con người của trường.

Trong lượt xem

person = Person.objects.filter(to_be_listed=True)
context['gender'] = person.get_gender_display()

Trong mẫu

{{ person.get_gender_display }}

Tài liệu của get_FOO_display ()


1

Những người khác đã chỉ ra rằng một phương thức get_FOO_display là những gì bạn cần. Tôi đang sử dụng cái này:

def get_type(self):
    return [i[1] for i in Item._meta.get_field('type').choices if i[0] == self.type][0]

mà lặp đi lặp lại trên tất cả các lựa chọn mà một mặt hàng cụ thể có cho đến khi nó tìm thấy một lựa chọn phù hợp với loại mặt hàng

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.