首页 > 解决方案 > 如何从 Django 中的 views.py 填写表单字段?

问题描述

我正在使用一个函数来记录页面加载和用户提交数据之间的时间。在该表单中,我创建了一个隐藏字段,以便管理员可以看到它。但是,我无法实现我的想法,因为我不明白如何从views.py 将时间提交给表单。如果有人可以建议一种更简单、更简单的替代方法来实现我想要做的事情,那对我也很有帮助。我的代码如下。

模型.py

class Responses(models.Model):
    question1 = models.TextField()
    question2 = models.TextField()
    question3 = models.TextField()
    timespent1 = models.TextField()

表格.py

class Question1Form(forms.ModelForm):
question1 = forms.CharField()
timespent1 = forms.TimeField(widget=forms.HiddenInput())

class Meta:
    model = Responses
    fields = ('question1','timespent1')

视图.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})

标签: djangopython-3.xdjango-modelsdjango-formsdjango-views

解决方案


您需要将开始时间存储在“其他地方”——也许将其存储在 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()

    # ...

推荐阅读