我对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)
提前致谢!
答案 0 :(得分:0)
你没有解释“我无法正常工作”实际意味着什么,所以这最多只是一种“疯狂猜测”的答案,但无论如何:
首先,您需要使用正确的HTTP方法放置字段并使用标记提交,并且字段“name”属性(不“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 }}
填充字段 - 在模板的上下文中,data
是Queryset
且没有start_date
也不是end_date
属性。
然后在您的视图中,您必须正确使用request.GET.get()
:
@login_required
def home(request):
# ...
start_date = request.GET.get('start_date')
end_date = request.GET.get('end_date')
.get()
是一种方法,它必须被调用,而不是下标(parens,而不是括号)。请注意,在用户实际提交表单之前,这些字段不在查询字符串中,而GET.get(...)
将返回None
,因此您必须通过向{{1}提供默认值来处理此情况或者通过测试表单是否已提交并且根本不返回查询集(或返回空的查询集,或返回整个未过滤的查询集等,选择是你的)。这是一个返回空查询集的版本。
此外,由于您没有使用Django .get()
,因此您将获得原始未经过整理的字符串,而forms.Form
则需要Python Queryset.filter()
或datetime.date
个对象,所以你必须手动验证和转换这些值:
datetime.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
请注意using a Django form会减少痛苦(并且更加强大)。
此外,您似乎并不熟悉HTML和Python。 Django是一个非常方便的python web框架,但它仍然要求你至少具备HTTP,HTML,当然还有Python的基本知识。如果您希望完成任何工作,我建议您花些时间学习这些主题。