如何在django中传递日期

时间:2018-05-01 15:05:32

标签: django django-forms django-views

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

我正在尝试构建一个用户输入from和to日期的视图,我需要根据这些日期从我的数据库中提取记录。我已经研究了如何在没有用户输入日期的情况下拉出记录(我使用系统日期进行了测试,根据官方网站上列出的文档使用了增量并且我理解了它)但是我现在仍然困在如何将它们作为用户输入。

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

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

date = models.DateField(auto_now_add=True) 

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

forms.py:

我使用的是未绑定的表单(未链接到在models.py中创建的模型),并且在一个简单的HTML页面中使用了列出here的Jquery插件来显示来自和迄今。

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

我知道如何获取用户输入的唯一方法是通过表单(绑定或未绑定),这通常最终作为POST请求通过插入记录或更新记录将数据传递到数据库。我不知道,也找不到任何其他方式获取用户输入,而不需要传递给db。

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

  • 如何在views.py视图中从POST请求中提取用户输入的from和to日期?

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

提前致谢..

5 个答案:

答案 0 :(得分:2)

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

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

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

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 :(得分:1)

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

当您从Django模板表单提交表单时,我假设您将使用django模板表单,例如使用小部件的输入字段和日期时间字段。提交表单时,您可以在

中查看
  

request.POST

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

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

喜欢这个

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

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

答案 2 :(得分:0)

尝试:

from datetime import datetime

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


更多信息here

答案 3 :(得分:0)

你的数据库应该是这样的,在oder中注册fromto

<强> mdoels.py

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

<强> forms.py

from django import forms.

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

<强> views.py

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)

<强> template_name.html

<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>

<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

  $( 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;
}

});

答案 4 :(得分:0)

我认为丹尼尔的答案解决了这个问题。我遵循相同的方法,但没有使用DateField。我使用CharField作为日期类型。