什么我不能在我的视图方法中使用我的模型的DateTimeField?

时间:2014-07-25 19:24:54

标签: python django django-templates django-views

在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

2 个答案:

答案 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