Django.db.models.field.CharField
У меня есть проект Django, который я пытаюсь собрать для очень простого опроса, в который нужно ввести демографическую информацию. Я замаскировал некоторые данные через админку сайта, чтобы заставить мой ListView работать на данный момент. К сожалению, я получаю странный ответ. Я создал models.py для выпадающего списка с полным написанием, а затем, чтобы сохранить его небольшим, я сделал фактическое хранение в db 1-3 символами. Когда я получаю представление списка, который использует 1 символ для хранения пола, он представляется как (<django.db.models.fields.CharField>,)
, я бы хотел, чтобы он представлялся как более широкое название "Male", "Female", "Non-binary". Однако для моих полей расы и национальности, которые состоят из 2 & 3 символов, они возвращаются как фактическое хранилище для БД (т.е. 'AA', 'NHP'). Мне удобнее работать с SQL, поэтому я не возражаю против добавления таблицы для ключа, так как сейчас там будет только 11 записей, но возможно, что в дальнейшем можно будет добавить больше вещей.
models.py:
from django.db import models
from django.contrib import admin
from django.contrib.auth.models import User
# Create your models here.
class StuData(models.Model):
id_num = models.IntegerField(primary_key=True)
entry_date = models.DateTimeField('Date of Entry')
MALE = 'm'
FEMALE = 'f'
OTHER = 'x'
GENUNK = 'u'
GENDER_SELECTIONS = [
(MALE,'Male'),
(FEMALE,'Female'),
(OTHER,'Non-Binary'),
(GENUNK,'Unknown'),
]
gender = models.CharField(max_length=1, choices=GENDER_SELECTIONS),
## Build the selections for the race field
AFR_RACE = 'AA'
ASI_RACE = 'AS'
WHI_RACE = 'WH'
UNK_RACE = 'UN'
RACE_SELECTIONS = [
(AFR_RACE, 'African-American'),
(ASI_RACE, 'Asian/Pacific Islander'),
(WHI_RACE, 'White'),
(UNK_RACE, 'Unknown Race'),
]
race = models.CharField(max_length=2, choices=RACE_SELECTIONS)
## Build the selections for the ethnicity field
HSP = 'HIS'
NHP = 'NHP'
UNK = 'UNE'
ETHNICITY_SELECTIONS = [
(HSP, 'Hispanic Origin'),
(NHP, 'Not of Hispanic Origin'),
(UNK, 'Unknown Ethnicity'),
]
ethnicity = models.CharField(max_length=10, choices=ETHNICITY_SELECTIONS)
stu_count = models.IntegerField(default=1)
user = models.ForeignKey(User, on_delete=models.CASCADE)
class Meta:
ordering = ["cad_num"]
def __str__(self):
return self.name
views.py:
from django.shortcuts import render
from django.http import HttpResponse
from mvstop.models import StuData
from django.views.generic.list import ListView
from django.views.generic.edit import UpdateView, CreateView
# Create your views here.
class StuDataList(ListView):
model = StuData
template = "myapp/studata_list.html"
fields = ""
paginate_by = 25
def Meta():
ordering = ['id_num']
def __str__(self):
return self.name
studata_list.html:
<!DOCTYPE html>
{% extends "./base.html" %}
{% block content %}
<h3>Most recent entries</h3>
<table id="studata">
<tr>
<th>ID Number</th>
<th>Entry Date</th>
<th>Gender</th>
<th>Race</th>
<th>Ethnicity</th>
<th>Count</th>
</tr>
{% for stu in studata_list %}
<tr>
<tr>
<td>{{ stu.id_num }}</td>
<td>{{ stu.entry_date }}</td>
<td>{{ stu.gender }}</td>
<td>{{ stu.race }}</td>
<td>{{ stu.ethnicity }}</td>
<td>{{ stu.occupants }}</td>
</tr>
{% endfor %}
</tr>
</table>
{% endblock %}
В Django есть встроенный метод для этого:
get_FIELD_display()
так в вашем шаблоне:
{% for stu in studata_list %}
<tr>
<tr>
<td>{{ stu.id_num }}</td>
<td>{{ stu.entry_date }}</td>
<td>{{ stu.get_gender_display }}</td>
<td>{{ stu.get_race_dispaly }}</td>
<td>{{ stu.get_ethnicity_display }}</td>
<td>{{ stu.occupants }}</td>
</tr>
{% endfor %}