【问题标题】:How can I fill up a form field from views.py in Django?如何从 Django 中的 views.py 填写表单字段?
【发布时间】:2019-11-01 04:55:51
【问题描述】:

我正在使用一个函数来记录页面加载和用户提交数据之间的时间。在该表单中,我创建了一个隐藏字段,以便管理员可以看到它。但是,我无法实现我的想法,因为我不明白如何从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})

【问题讨论】:

    标签: django python-3.x django-models django-forms django-views


    【解决方案1】:

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

    【讨论】:

    • 好的。这看起来有点复杂,因为我是初学者,但我想我可以解决。但是这个方法会不会把花费的时间上传到数据库呢?
    猜你喜欢
    • 2014-09-22
    • 2012-04-21
    • 2023-02-20
    • 1970-01-01
    • 1970-01-01
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    相关资源
    最近更新 更多