【问题标题】:Django DateRangeField issueDjango DateRangeField 问题
【发布时间】:2016-11-23 02:08:32
【问题描述】:

DateRangeField 使用 Forms 插入数据库时​​遇到问题。

model.py

from django.contrib.postgres.fields import DateRangeField
from django.db import models

class Event(models.Model):
    name = models.CharField(max_length=200)
    datefromto = DateRangeField() 

views.py

date_from = '2011-01-01'
date_to = '2011-01-31'
data = {
    "name" : "Test Name",
    "datefromto" : [date_from,date_to ]
}

form = Event_form(data)
if form.is_valid():
    form.save()
else:
    print(form.errors)

forms.py

class Event_form(forms.ModelForm):
    class Meta:
        model = Event
        fields = ('name','datefromto')

    def clean(self):
        print(self.cleaned_data)
        #{"name" : "Test Name"} there should be 'datefromto' key

当我调用 form.is_valid() 时,它返回 "datefromto is required" 它不应该是这样的,因为字典中有一个 'datefromto'。当我尝试在 form clean 函数中打印 clean_data 时,它只打印 {"name" : "Test Name"} 而没有 datefromto 键。


Django 1.9、Python 2.7 和 Postgre 9.3.14。

【问题讨论】:

    标签: python django postgresql


    【解决方案1】:

    在深入了解 django 源代码后,您应该为 range 字段附加number suffix:

    date_from = '2011-01-01'
    date_to = '2011-01-31'
    data = {
        "name" : "Test Name",
        "datefromto_0" : date_from,
        "datefromto_1" : date_to
    }
    
    form = Event_form(data)
    if form.is_valid():
        form.save()
    else:
        print(form.errors)
    

    我用pdb追踪django里面的代码,发现了这个技巧……

    下次遇到 django 的其他问题时,可以使用pdb 进行追踪。确实是python调试的好工具……

    希望它会有所帮助... :)。

    【讨论】:

    • 它就像一个魅力!谢谢@Enix。很快就会检查那个 pdb 家伙。
    • +1 来自我。非常好的答案和作品就像一个魅力,确实!请问@Enix 你在源代码的什么地方找到了number suffix 的需要?
    • @nik_m 你可以按照is_valid的执行路径,然后你会发现它在django/forms/widgets.py中调用了MultiWidget.value_from_datadict。在此方法中,它将使用字段name 后缀和枚举索引i 来生成从data dict 中提取值的键。确实需要一点注意力才能找到这条线......
    • 酷!非常感谢!
    • 他们应该在官方文档中包含这个。我真的在任何地方都找不到它。
    猜你喜欢
    • 2018-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-04
    • 2017-12-14
    • 2020-12-26
    • 2018-03-14
    • 2016-01-27
    相关资源
    最近更新 更多