【问题标题】:how to pass dates in django如何在 django 中传递日期
【发布时间】:2018-10-11 15:11:46
【问题描述】:

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

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

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

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

date = models.DateField(auto_now_add=True) 

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

forms.py:

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

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

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

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

  • 如何从views.py 视图中POST 请求的用户输入中提取起始日期和结束日期?

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

提前谢谢..

【问题讨论】:

    标签: django django-forms django-views


    【解决方案1】:

    这正是 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
         ....
    

    【讨论】:

      【解决方案2】:

      您的数据库应该是这样的,以便注册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;
      }
      

      });

      【讨论】:

        【解决方案3】:

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

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

        中进行检查

        请求.POST

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

        当您在 request.POST 中获得结果时,无论是字符串还是日期时间对象,我都不确定最近没有使用 django 表单。您可以使用日期时间库将字符串转换为日期时间对象。或者,如果它是日期时间对象,您可以将其直接保存在模型日期时间字段中。

        喜欢这个

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

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

        【讨论】:

        • 时区数据呢?假设用户从浏览器提交时间,他们的时区可能与服务器不同。
        【解决方案4】:

        试试:

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


        更多信息here

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-03-05
            • 2018-06-07
            • 1970-01-01
            • 1970-01-01
            • 2016-04-07
            • 2015-03-18
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多