Django: มูลค่าตัวเลือกการแสดงผล


245

models.py:

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)

views.py:

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)

แม่แบบเมื่อผมเรียกperson.genderฉันได้รับ'M'หรือ'F'แทนหรือ'Male''Female'

จะแสดงค่า ( 'Male'หรือ'Female') แทนรหัส ( 'M'/ 'F') ได้อย่างไร?



ฉันลองใช้วิธีนี้ในเทมเพลตของฉันที่ฉันใช้: {% สำหรับบุคคลใน object_list%} html {{person.get_gender_display ()}} html {% endfor%} ฉันได้รับข้อผิดพลาดต่อไปนี้: ไม่สามารถแยกวิเคราะห์ ส่วนที่เหลือ: '()' จาก 'person.get_gender_display ()'
Shankze

7
ฉันไม่ดีฉันไม่ควรรวม '()' ไว้หลัง person.get_gender_display มันใช้งานได้แล้ว ขอบคุณ
Shankze

3
เพียงความคิดเห็นเล็กน้อยเนื่องจากเพศจะเป็นเพียง M หรือ F (ความยาวอักขระ 1 ตัวเท่านั้น) ดังนั้นจึงไม่มีความรู้สึกที่จะกำหนดความยาวสูงสุดของ charfield ให้200เป็น ด้วยmax_lenght=1ก็พอจะทำให้เว็บไซต์ของคุณมีประสิทธิภาพมากขึ้นและคุณจะให้แน่ใจว่าคุณเคยมีข้อมูลที่ไม่ถูกต้อง :)
Alejandro Garcia

คำตอบ:


502

ดูเหมือนว่าคุณกำลังติดตามget_FOO_display()ถูก- แน่นอนที่สุดสิ่งที่คุณต้องการ:

ในเทมเพลตคุณจะไม่รวม()อยู่ในชื่อของวิธีการ ทำดังต่อไปนี้:

{{ person.get_gender_display }}

วิธีนี้ไม่มีค่า แต่นอกเหนือจากการใช้วิธีการวิธีการดึงค่าที่เก็บไว้ในพูดว่า {{i.item.what_to_put_here}} คืออะไร?
KhoPhi

11
สำหรับผู้ที่ใช้ Jinja2 สำหรับแม่แบบของพวกเขาคุณควรรวมวงเล็บไว้ด้วย {{ person.get_gender_display() }}
ดัม b

1
คะแนนโบนัส: วิธีที่ดีที่สุดในการทำเช่นนี้คือถ้าคุณส่งข้อมูลของคุณผ่าน JSON (เช่นในสถานการณ์การให้เลขหน้า) เป็นการดีที่ไม่มีค่าใช้จ่ายในการสร้างอินสแตนซ์โมเดลทีละตัวและเรียกใช้ get_field_display ()
DylanYoung

7
ต้องรัก Django เกือบ 10 ปีต่อมาและคำตอบก็ยังคงใช้ได้! ขอบคุณ +1 และดื่มกับฉัน
Marc

1
อย่างใดนี้ไม่สามารถดึงข้อความแปล มีความคิดเกี่ยวกับวิธีรับข้อความที่แปลแล้วหาก i18 ถูกนำไปใช้ในเว็บไซต์แล้ว
Anoop Nair

16

สำหรับทุกฟิลด์ที่มีการตั้งค่าตัวเลือกวัตถุจะมีเมธอด get_FOO_display () โดยที่ FOO เป็นชื่อของฟิลด์ วิธีการนี้จะส่งกลับค่า“ มนุษย์อ่านได้” ของสนาม

ในมุมมอง

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

ในเทมเพลต

{{ person.get_gender_display }}

เอกสารประกอบของ get_FOO_display ()


1

คนอื่น ๆ ได้ชี้ให้เห็นว่าวิธีการ get_FOO_display เป็นสิ่งที่คุณต้องการ ฉันใช้สิ่งนี้:

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

ซึ่งจะวนซ้ำตัวเลือกทั้งหมดที่มีอยู่ในรายการจนกว่าจะพบรายการที่ตรงกับประเภทรายการ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.