Skip to main content
 首页 » 编程设计

python之Django之无法让模型显示在模板中

2024年09月07日28落叶无声

我正在为 Volunteer Firefighters 创建可用性应用程序,但无法让其中一个模型字段显示在模板中:

模型.py

# -*- coding: utf-8 -*- 
from __future__ import unicode_literals 
 
from django.db import models 
 
# Create your models here. 
class Team(models.Model): 
  name = models.CharField('Name', max_length = 200) 
 
  def __str__(self): 
    return self.name 
 
class Firefighter(models.Model): 
  RANKS = ( 
    ('CFO', 'Chief Fire Officer'), 
    ('DCFO','Deputy Chief Fire Officer'), 
    ('SSO', 'Senior Station Officer'), 
    ('SO', 'Station Officer'), 
    ('SFF', 'Senior Firefighter'), 
    ('QFF', 'Qualified Firefighter'), 
    ('FF', 'Firefighter'), 
    ('RFF', 'Recruit Firefighter'), 
    ('OS', 'Operational Support'), 
  ) 
 
  STATUS_OPTIONS = ( 
    ('AV', 'Available'), 
    ('OD', 'On Duty'), 
    ('UN', 'Unavailable'), 
    ('LV', 'Leave'), 
  ) 
   
  rank = models.CharField("Rank", max_length = 50 , choices=RANKS, default='RFF') 
  first_name = models.CharField("First Name", max_length = 200) 
  last_name = models.CharField("Last Name", max_length = 200) 
  start_date = models.DateField(name="Start Date") 
  status = models.CharField("Status", max_length = 20 , choices=STATUS_OPTIONS, default='Available') 
  driver = models.BooleanField('Driver', default=False) 
  officer = models.BooleanField('Officer Qualified', default=False) 
  teams = models.ManyToManyField(Team) 
 
  def __str__(self): 
   return self.first_name + ' ' + self.last_name 
 
  class Meta: 
        verbose_name = "Firefighter" 
        verbose_name_plural = "Firefighters" 

views.py

# -*- coding: utf-8 -*- 
from __future__ import unicode_literals 
 
from django.shortcuts import render 
from django.http import HttpResponse 
from django.contrib.auth.decorators import login_required 
from django.forms import ModelForm 
from .models import Firefighter 
from django.http import HttpResponseRedirect 
 
# Create your views here. 
@login_required(login_url='/login/') 
def status(request): 
 
  firefighters = Firefighter.objects.all() 
 
  context = { 
    'firefighters': firefighters, 
    'availableCount': firefighters.filter(status='AV').count() + firefighters.filter(status='OD').count(), 
    'leaveCount': firefighters.filter(status='LV').count(), 
    'unAvCount': firefighters.filter(status='UN').count() 
  } 
   
  return render(request, 'status.html', context) 
 
@login_required(login_url='/login/') 
def details(request, id): 
  class ChangeStatus(ModelForm): 
    class Meta: 
      model = Firefighter 
      fields = ['status'] 
   
  form = ChangeStatus() 
  firefighter = Firefighter.objects.get(id=id) 
 
  if request.method == 'POST': 
    form = ChangeStatus(request.POST, instance=firefighter) 
    if form.is_valid(): 
      form.save()  
      return HttpResponseRedirect('/status/') 
  else: 
    form = ChangeStatus() 
 
  context = { 
    'firefighter': firefighter, 
    'form': form 
  } 
   
  return render(request, 'details.html', context) 
 
def members(request): 
 
  firefighters = Firefighter.objects.all().order_by('rank') 
 
  context = { 
    'firefighters': firefighters, 
  } 
  return render(request, 'members.html', context) 

和无法正确呈现的 members.html:

{% extends "base.html" %} 
 
{% block content %} 
  <ul> 
    {% for firefighter in firefighters %} 
      <li> {{firefighter.rank}} {{firefighter.first_name}} {{firefighter.last_name}} {{firefighter.start_date}}</li> 
    {% endfor %} 
  </ul> 
{% endblock content %} 

members.html 将正确呈现 firefighter.first_name 和 firefighter.last_name 但没有显示 firefighter.start_date 即使每个消防员在数据库中都有指定的开始日期。

关于原因有什么想法吗?

额外的问题:在查询数据库时,有什么方法可以让我对模型中列出的排名进行排序吗?

请您参考如下方法:

在您为开始日期定义字段的位置:

start_date = models.DateField(name="Start Date") 

应该是:

start_date = models.DateField("Start Date") 

Date_Field 中的第一个 arg 是 verbose_name,它将自动使用更可接受的 snake_case 版本的名称设置名称。