所以我试图模仿谷歌应用的状态页面:http://www.google.com/appsstatus#hl=en但是我们自己的服务器的备份。而不是左边的服务名称,它将是服务器名称,但日期和希望分页也将在那里。我的模型看起来非常相似:
from django.db import models
STATUS_CHOICES = (
('UN', 'Unknown'),
('NI', 'No Issue'),
('IS', 'Issue'),
('NR', 'Not Running'),
)
class Server(models.Model):
name = models.CharField(max_length=32)
def __unicode__(self):
return self.name
class Backup(models.Model):
server = models.ForeignKey(Server)
created = models.DateField(auto_now_add=True)
modified = models.DateTimeField(auto_now=True)
status = models.CharField(max_length=2, choices=STATUS_CHOICES, default='UN')
issue = models.TextField(blank=True)
def __unicode__(self):
return u'%s: %s' % (self.server, self.get_status_display())
我的问题是我有一段时间显示我需要的信息。午夜过后,每天都会运行一个cron作业,并为当天的每台服务器添加一行,默认状态未知(UN)。
我的backups.html:
{% extends "base.html" %}
{% block content %}
<table>
<tr>
<th>Name</th>
{% for server in servers %}
<th>{{ created }}</th>
</tr>
<tr>
<td>{{ server.name }}</td>
{% for backup in server.backup_set.all %}
<td>{{ backup.get_status_display }}</td>
{% endfor %}
</tr>
{% endfor %}
</table>
{% endblock content %}
这实际上有效,但我不知道如何显示日期。显然{{ created }}
除了服务器没有创建日期之外什么都不做。备份有,因为它是一个cron作业,应该只有X行的任何特定日期(取决于我们当天关注的服务器数量)。
摘要
我想创建一个表,X是服务器名称,Y是从今天开始的日期,而所有单元格都是备份的状态。上面的模型和模板应该希望让你知道我的思考过程,但我愿意改变任何事情。基本上我是创建一个花哨的Excel电子表格。
答案 0 :(得分:0)
我建议添加一个函数来获取要显示的日期,这与Server实例无关。然后,您可以使用它来获取最近的备份并获取标头的日期。在models.py中:
from django.db import models
import datetime
def recent_dates():
return [datetime.date.today() - datetime.timedelta(days=days)
for days in range(-6, 1)]
class Server(models.Model):
...
def backup_for_date(self, date):
next_date = date + datetime.timedelta(days=1)
return self.backup_set.get(created__gte=date, created__lt=next_date)
def recent_backups(self):
return [self.backup_for_date(date) for date in recent_dates()]
然后,如果您使用views.py中的函数:
from django.shortcuts import render_to_response
from myapp.models import Server, recent_dates
def status(request):
servers = Server.objects.all()
return render_to_response('status.html',
{'dates': recent_dates(), 'servers': servers}
)
...您可以使用recent_dates变量在模板中打印标题:
{% extends "base.html" %}
{% block content %}
<table>
<tr>
<th>Name</th>
{% for date in recent_dates %}
<th>{{ date }}</th>
{% endfor %}
</tr>
{% for server in servers %}
<tr>
<td>{{ server.name }}</td>
{% for backup in server.recent_backups() %}
<td>{{ backup.get_status_display }}</td>
{% endfor %}
</tr>
{% endfor %}
</table>
{% endblock content %}
如果数据丢失,使用此方法还可确保单元格不会移位。如果数据丢失,我提供的代码将在get()
backup_for_date()
内的backup_for_date()
方法调用中引发异常,但在这种情况下可以轻松修改{{1}}以返回None。