我正在使用一个函数来记录页面加载和用户提交数据之间的时间。以这种形式,我创建了一个隐藏字段,以便管理员可以看到它。但是,我无法实现我的想法,因为我不知道如何从views.py向表单提交时间。如果有人可以提出一种更简便的替代方法来实现我的目标,那对我也将非常有帮助。我的代码如下。
models.py
class Responses(models.Model):
question1 = models.TextField()
question2 = models.TextField()
question3 = models.TextField()
timespent1 = models.TextField()
forms.py
class Question1Form(forms.ModelForm):
question1 = forms.CharField()
timespent1 = forms.TimeField(widget=forms.HiddenInput())
class Meta:
model = Responses
fields = ('question1','timespent1')
views.py
def qone(request):
if request.method =="GET":
starttime = my_timer()
elif request.method == "POST":
form = Question1Form(request.POST)
if form.is_valid():
endtime = my_timer()
timespentstr = '{0} seconds'.format(endtime-starttime)
#Do something to set timespent1 field = timespentstr here
form = form.save()
else:
form = Question1Form
return render(request,'question1.html',{'form':form})
答案 0 :(得分:0)
您需要将开始时间存储在“其他地方”-也许将其存储在GET中的会话中,然后在POST中从那里拉回它:
def qone(request):
if request.method == 'GET':
request.session['start_time'] = mytimer()
form = Question1Form()
elif request.method == 'POST':
form = Question1Form(request.POST, request.FILES)
if form.is_valid():
end_time = mytimer()
start_time = request.session.get('start_time')
time_spent = end_time - start_time
....
form.save()
return render(request, 'question1.html', {'form': form})
您还可以考虑直接将开始时间传递给表单,然后在其中包含所有逻辑,但这可能会使事情复杂化。也许将“花费的时间”传递给表单构造函数可能是最好的方法。
class Question1Form(forms.Form):
def __init__(self, *args, **kwargs):
self.time_taken = self.kwargs.pop('time_taken', None)
super().__init__(*args, **kwargs)
def qone(request):
if request.method == 'GET':
form = Question1Form()
request.session['start_time'] = my_timer()
elif request.method == 'POST':
form = Question1Form(
request.POST, request.FILES,
time_taken=my_timer() - request.session.pop('start_time')
)
if form.is_valid():
form.save()
# ...