Как я могу заполнить поле формы из views.py в Django? - PullRequest
1 голос
/ 01 ноября 2019

Я использую функцию для записи времени между загрузкой страницы и отправкой данных пользователем. В этой форме я создал скрытое поле, чтобы администратор мог его видеть. Однако я не могу реализовать свою идею, так как не понимаю, как я могу отправить время в форму из 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})

1 Ответ

0 голосов
/ 01 ноября 2019

Вам нужно будет сохранить время начала «где-то еще» - возможно, сохранить его в сеансе в 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()

    # ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...