我是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
)?
提前致谢..
答案 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中注册from
和to
<强> 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作为日期类型。