在Django应用程序中,我正在尝试在页面上显示模型的信息,但在尝试使用DateTimeField
显示创建日期时,它会返回服务器错误。这是我的代码:
模型
class User(models.Model):
id = models.IntegerField(primary_key=True)
name = models.CharField(unique=True, max_length=128)
created_date = models.DateTimeField()
class Meta:
managed = False
db_table = 'user'
def __unicode__(self):
return self.name
查看
def user_detail(request, pk):
user = User.objects.get(id=pk)
# Debugging
print user.name # Works fine, prints "ZAD-Man"
print user.created_date # Works fine, prints "2014-07-21 00:00:00"
print type(user.created_date) # Breaks with a 500 Server Error
html = "<dt>Name</dt><dd>" + user.name + "</dd><dt>Date Added</dt><dd>" + user.created_date + "</dd>" # Breaks (when the debug lines are removed so that it reaches here)
return HttpResponse(html)
一切正常,直到我尝试使用created_date
,无论是在type()
还是将其添加到字符串中。我做错了什么,我该如何解决?
编辑:以下是具体错误:
当它在type(user.created_date)
上中断时,我得到:
TypeError: 'unicode' object is not callable
当它在...+ user.created_date +...
上中断时(如果我删除调试行会发生这种情况),我得到:
TypeError: coercing to Unicode: need string or buffer, datetime.datetime found
答案 0 :(得分:2)
html = "<dt>Name</dt><dd> {} </dd><dt>Date Added</dt><dd> {} </dd>".format(user.name, user.created_date)
你也可以在datetime值上调用str(),并保持html元素+格式。
修改
我不确定为什么类型不适合你。你能发布时间保存到模型的代码吗?我做了一个django模型的测试运行,其字段设置为:
date = models.DateField(auto_now=True, auto_now_add=True)
我在shell中测试了你的问题
>>> print t.date
2014-06-23
>>> print type(t.date)
<type 'datetime.date'>
>>> print type(t.time)
<type 'datetime.time'>
答案 1 :(得分:1)
关注点的分离是Django philosophy所关注的问题之一。您在视图中使用的HTML代码应该被提取到模板中并在视图中呈现,并在上下文中传递user
对象:
mytemplate.html
:
<dt>Name</dt>
<dd>{{ user.name }}</dd>
<dt>Date Added</dt>
<dd>{{ user.created_date }}</dd>
views.py
:
from django.template.response import TemplateResponse
def user_detail(request, pk):
user = User.objects.get(id=pk)
return TemplateResponse(request, 'mytemplate.html', {'user': user})
此外,请考虑切换到Class-based views,而不是基于功能的视图。具体而言,您的视图很多类似DetailView
。