DateTime对象是none - Python

时间:2014-08-08 13:13:02

标签: python django datetime

我在Django里面这样做。 DateTime字符串成功传递给POST。这是我的代码:

vk = Vk()
day1 = request.POST['day1']
vk.day1 = datetime.datetime.strptime(day1, '%m/%d/%Y %I:%M %p')
vk.save()

这是POST信息的格式:

'day1': 'MM/DD/YYYY HH:MM AM/PM' # AM/PM meaning either AM or PM

问题是vk实例上的DateTimeFieldNone

class Vk(models.Model):
    day1 = models.DateTimeField(null=True, blank=True)

我在HTML文件中看到它是None:

{% for vk in vk %}
{{ vk.day1 }}
{% endfor %}

,相当于无。

这是负责呈现模板的视图:

def list_verkefni(request):
    vk = Vk.objects.all()
    vm = Vm.objects.all()

    return render(request, 'list_verkefni.html', 
    {'vk': vk, 'vm': vm}
    )

1 个答案:

答案 0 :(得分:2)

为什么不使用ModelForm?

someapp / forms.py:

class VkForm(forms.ModelForm):
    class Meta:
        model = Vk
        fields = ('day1', )

    def __init__(self, *args, **kwargs):
        super(VkForm, self).__init__(*args, **kwargs)
        self.fields['day1'].input_formats = ['%m/%d/%Y %I:%M %p', ]

someapp / views.py:

def myview(request):
    form = VkForm(request.POST or None)
    if request.method == "POST" and form.is_valid():
        obj = form.save()
        return HttpResponseRedirect('/somewhere/')
    return render(
        request, 'template.html',
        {'form': form}
    )

是的,你写了更多的代码,但是:

  • 您可以通过好的错误消息获得完整的验证
  • 无论何时扩展您的模型,您都不需要重写代码,只需将字段名称添加到ModelForm中
  • 您不需要对Python数据类型进行低级转换

这被认为是一种不好的做法:

{% for vk in vk %}
{{ vk.day1 }}
{% endfor %}

虽然这在Django模板引擎中有效,但却非常混乱。如果您在Python中编写相同内容,vk将被覆盖。每当您处理项目列表时,请将_list附加到变量名称,例如:object_listvk_list,以区分单个对象和列表。

为了更好地调试代码,我建议使用pip install pudb并执行以下操作:

vk = Vk()
day1 = request.POST['day1']
import pudb; pudb.set_trace()
vk.day1 = datetime.datetime.strptime(day1, '%m/%d/%Y %I:%M %p')
vk.save()

运行本地开发服务器,执行POST请求并检查终端。检查request.POST['day1']是否真的与您预期的一样,以及是否在day属性上设置了日期时间实例。