【问题标题】:Importing date from HTML into Django views将日期从 HTML 导入 Django 视图
【发布时间】:2017-11-13 12:27:10
【问题描述】:

我对 Django 还很陌生,但我遇到了一些问题。我有我的 html 模板,其中有两个 html 日期字段 - start_date 和 end_date。我想将这些字段的内容传递到我的 views.py 中,然后显示该时间段的数据,但我无法使其正常工作。任何帮助将不胜感激。相关代码:

home.html

  Select time period:
  <br>
  From:
  <input id = "start_date" type="date" name="From" value="{{data.start_date|date:"d/m/Y"}}">
  To:
  <input id = "end_date" type="date" name="To" value="{{data.end_date|date:"d/m/Y"}}">
  <input type = "submit">

{% for data in data.all %}
      {% if data.profile.user.username == user.username %} 

      <tr>
        <td>{{data.profile.user.username}}</td>
        <td>{{data.date}}</td>
      </tr>

      {% endif %}
      {% endfor  %}

views.py

import datetime
from datetime import date

@login_required 
def home(request):
    if request.user.is_authenticated():
            user = request.user.username


    start_date = request.GET.get['start_date']
    end_date = request.GET.get['end_date']

    data = Data.objects.filter(date__range=[start_date, end_date])

    context = {   

            'data': data,
            'cpu_hours_all': cpu_hours_all,
    }

models.py

class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE

def __str__(self):
    return self.user.username


class Data(models.Model):
    date = models.DateField(blank=True) 
    profile = models.ForeignKey(Profile , on_delete=models.CASCADE)

提前致谢!

【问题讨论】:

    标签: python html django


    【解决方案1】:

    您未能解释“我无法使其正常工作”的实际含义,因此这至多是一个部分的和一种“疯狂猜测”的答案,但无论如何:

    首先,您需要使用正确的 HTTP 方法将您的字段和提交放入标签中,并且您的字段“名称”属性(不是“id”属性)必须与您的匹配在你的视野中抬头:

    <form method="GET">
      <legend>Select time period:</legend>
      <br>
      From:
      <input id="start_date" type="date" name="start_date" value="{{start_date|date:"d/m/Y"}}">
      To:
      <input id="end_date" type="date" name="end_date" value="{{end_date|date:"d/m/Y"}}">
      <input type="submit">
    </form>
    

    另请注意,我们使用 {{ start_date }}{{ end_date }} 填充字段 - 在您的模板上下文中,dataQueryset 并且没有 start_dateend_date 属性。

    那么在您看来,您必须正确使用request.GET.get()

    @login_required 
    def home(request):
        # ...
        start_date = request.GET.get('start_date')
        end_date = request.GET.get('end_date')
    

    .get() 是一个方法,它必须被调用,而不是下标(括号,而不是括号)。请注意,在用户实际提交表单之前,这些字段不会出现在查询字符串中,GET.get(...) 将返回None,因此您必须通过为.get() 提供默认值或测试是否处理这种情况表单已提交并且根本没有返回查询集(或返回一个空的查询集,或返回整个未过滤的查询集等,您可以选择)。这是一个返回空查询集的版本。

    另外,由于您没有使用 Django forms.Form,因此您将在此处获得未经处理的原始字符串,而 Queryset.filter() 需要 Python datetime.datedatetime.datetime 对象,因此您必须验证和手动转换这些值:

    # ...
    parsed_start_date = None
    parsed_end_date = None
    if start_date and end_date:    
        errors = {}
        try:
            parsed_start_date = datetime.datetime.strptime(start_date, "%d/%m/%Y")
        except ValueError:
            errors["start_date"] = "Invalid date" # etc..
        try:
            parsed_end_date = datetime.datetime.strptime(end_date, "%d/%m/%Y")
        except ValueError:
            errors["end_date"] = "Invalid date" # etc..
    
    if parsed_start_date and parsed_end_date:
        data = Data.objects.filter(date__range=[parsed_start_date, parsed_end_date])
    else:
        data = Data.objects.none()  # empty queryset
    
    context = {   
            'data': data,
            'errors': errors,
            'start_date': start_date,
            'end_date': end_date
           }
    
    # etc
    

    然后您必须更改模板以适应这些更改(不要尝试将 |date 过滤器应用于字符串,显示错误...):

    <form method="GET">
      Select time period:
      <br>
      From:
      <input id="start_date" type="date" name="start_date" value="{{start_date}}">
      {% if errors.start_date %}
          <span class="error">{{ errors.start_date }}</span>
      {% endif %}
      To:
      <input id="end_date" type="date" name="end_date" value="{{end_date}}">
      {% if errors.end_date %}
          <span class="error">{{ errors.end_date }}</span>
      {% endif %}
    
      <input type="submit">
    </form>
    

    请注意,using a Django form 会减少痛苦(也更健壮)。

    此外,您似乎并不真正精通 HTML 或 Python。 Django 是一个非常方便的 Python Web 框架,但它仍然要求您至少具备 HTTP、HTML 以及 Python 的基本知识。如果您希望完成任何事情,我建议您花一些时间学习这些主题。

    【讨论】:

    • 感谢您全面全面的回复。我会阅读建议的主题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    相关资源
    最近更新 更多