如何在Django传递日期

how to pass dates in django

我是一个新手,遇到了一个小问题。

我正在尝试构建一个视图,用户在其中输入"开始"和"结束"日期,我需要根据这些日期从数据库中提取记录。我已经解决了如何在没有用户输入日期的情况下提取记录(我使用系统日期进行了测试,根据官方网站上列出的文档使用了delta,我理解了这一点),但是现在我仍然坚持如何将它们作为用户输入。

以下是我的项目的一些相关细节:

models.py包含很多字段,但这里是日期字段条目:

1
date = models.DateField(auto_now_add=True)

此条目定义创建记录的日期。

PYS:

我正在使用一个未绑定的表单(未链接到在models.py中创建的模型),并且正在使用一个简单的HTML页面中列出的jquery插件来显示"从"和"到"日期。

因此,根据列出的文档,日期以纯文本形式在表单中传递。

我知道如何获取用户输入的唯一方法是通过一个表单(绑定或未绑定),该表单通常以一个POST请求结束,通过插入记录或更新记录将数据传递到数据库中。我不知道也找不到任何其他方法来获取不需要传递给数据库的用户输入。

有人能建议如何使用此插件获取用户输入日期,以及:

  • 如何从views.py视图中的post请求的用户输入中提取"从"和"到"日期?

  • 如何将其转换为DateField(或者如果采用这些日期的表单应将日期设置为DateField

提前谢谢……


这正是Django表格所做的。表单不需要保存到数据库。表单的主要职责是验证和清理数据,这正是您所要求的。所以,给出这样一个形式:

1
2
class MyForm(forms.Form):
   date = forms.DateField()

您可以访问视图中的日期对象:

1
2
3
4
5
6
def my_view(request):
    if request.method == 'POST':
        form = MyForm(request.POST)
        if form.is_valid():
            date = form.cleaned_data['date'] # this will be a datetime.date object
     ....

1)如何在views.py视图中的post请求之后从用户输入表单中提取"开始"和"结束"日期?

当您从django模板表单提交表单时,我假设您已经使用了django模板表单,比如使用小部件的输入字段和日期时间字段。提交表单时,您可以将其签入

request.POST

2)如何将其转换为日期字段(或者采用这些日期的表单应将日期设置为日期字段)?

当您得到request.post的结果时,无论是string还是datetime对象,我不确定最近是否使用了django表单。可以使用日期时间库将字符串转换为日期时间对象。或者,如果它是datetime对象,可以直接将其保存在model datetime字段中。

这样地

1
datetime.strptime(time_string, '%Y-%m-%d %H:%M:%S')

根据您的示例,它将以字符串形式出现,您必须将其转换为日期时间对象,然后将其保存在模型中。


我认为丹尼尔的回答解决了这个问题。我采用了同样的方法,但没有使用datefield。我用charfield作为日期类型。


您的数据库应该是这样的,以便注册fromto

Mdoels.Py

1
2
3
class ClassModel(models.Model):
    xfrom = models.DateField(blank=True,null=True)
    to = models.DateField(blank=True,null=True)

表单

1
2
3
4
5
from django import forms.

class DateForm(forms.Form):
     xfrom = forms.DateField(input_formats = ['%m/%d/%Y'])
     to = forms.DateField(input_formats = ['%m/%d/%Y'])

VIEW

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from .forms import DateForm
from .models import ClassModel

def dateView(request):
    form = DateForm(request.POST or None)
    if request.method == 'POST':
        if form.is_valid():
            xfrom = form.cleaned_data.get('xfrom')
            to = form.cleaned_data.get('to')

        cl = ClassModel.objects.create(xfrom=xfrom,to=to)

    context = ( { 'form':form } )
    return render(request,'template_name.html',context)

模板u name.html

1
2
3
4
5
6
7
8
9
10
11
<script src="https://code.jquery.com/jquery-1.12.4.js">
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js">

<form action="" method="post">{% csrf_token %}
    <label for="id_xfrom">From</label>
    {{form.xfrom}}

    <label for="id_to">to</label>
    {{form.to}}
    <button type='submit'>Submit</button>
</form>

JS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
  $( function() {
var dateFormat ="mm/dd/yy",
  from = $("#id_from" )
    .datepicker({
      defaultDate:"+1w",
      changeMonth: true,
      numberOfMonths: 3
    })
    .on("change", function() {
      to.datepicker("option","minDate", getDate( this ) );
    }),
  to = $("#id_to" ).datepicker({
    defaultDate:"+1w",
    changeMonth: true,
    numberOfMonths: 3
  })
  .on("change", function() {
    from.datepicker("option","maxDate", getDate( this ) );
  });

function getDate( element ) {
  var date;
  try {
    date = $.datepicker.parseDate( dateFormat, element.value );
  } catch( error ) {
    date = null;
  }

  return date;
}

(});


尝试:

1
2
3
from datetime import datetime

date_converted = datetime.strptime(time_string, '%Y-%m-%d %H:%M:%S')

更多信息在这里