Форма модели Django не отображает информацию, хранящуюся в сеансе

#django #django-models #django-forms

#django #django-модели #django-forms

Вопрос:

Мой views.py файл

 class multi_form(View):
    model=Customer
    template_name='index.html'
    def get_initial_data(self, request):
        form=RegForm(initial={
        'first_name':request.session.get('first_name',''),
        'last_name':request.session.get('last_name',''),
        'personal_email':request.session.get('personal_email',''),
        'official_email':request.session.get('official_email',''),
        'permanent_address':request.session.get('current_address',''),
        'current_address':request.session.get('permanent_address',''),
        'pan_card_number':request.session.get('pan_card_number',''),
        'aadhar_card_number':request.session.get('aadhar_card_number',''),
        'loan_amount':request.session.get('loan_amount','')})
        return form

    def get(self, request):
        if request.session.has_key('pan_card_number'):
            form=RegForm(get_initial_data(self,request))
        context = {'form': form}
        return render(request, 'customer/index.html', context)
    
    def post(self, request):
        form=RegForm()
        if request.method=='POST':
            form=RegForm(request.POST, request.FILES)
            if form.is_valid():
                request.session['first_name']=form.cleaned_data['first_name']
                request.session['last_name']=form.cleaned_data['last_name']
                request.session['personal_email']=form.cleaned_data['personal_email']
                request.session['official_email']=form.cleaned_data['official_email']
                request.session['current_address']=form.cleaned_data['current_address']
                request.session['permanent_address']=form.cleaned_data['permanent_address']
                request.session['pan_card_number']=form.cleaned_data['pan_card_number']
                request.session['aadhar_card_number']=form.cleaned_data['aadhar_card_number']
                request.session['loan_amount']=form.cleaned_data['loan_amount']
                form.save()
                messages.success(request, "Your Response has been recorded")
                return render(request, 'customer/index.html')

            
        context = {'form': form}
        return render(request, 'customer/index.html', context)
  

Я хочу, чтобы форма автоматически заполняла поля, заполненные ранее, теми, которые я сохранил в переменных сеанса django. Итак, когда у пользователя появляется запрос GET при повторном посещении страницы, ему показываются данные, которые он заполнил ранее. Как я буду это реализовывать?

Мой файл шаблона

  <fieldset>
    <h2 class="fs-title">Registeration Form</h2>
    <h3 class="fs-subtitle">Please fill the details below</h3>
    {{form.first_name}}
    {{form.last_name}}
    {{form.personal_email}}
    {{form.official_email}}
    {{form.permanent_address}}
    {{form.current_address}}
    {{form.pan_card_number}}
    {{form.aadhar_card_number}}
    {{form.loan_amount}}
    <input type="button" name="next" class="next action-button" value="Next" />
  </fieldset>
  

Останется ли мой файл шаблона прежним или мне также нужно его изменить?

Ответ №1:

Для этого используйте initial параметр в форме. Это укажет форме, какие поля следует заполнить изначально.

 form = RegForm(initial={
    'first_name': request.session.get('first_name', ''),
    ...
}, ...)
  

Используйте ее во всех местах, где вы создаете экземпляр формы, поэтому может быть полезно создать функцию get_initial_data(request) , а затем выполнить RegForm(initial=get_initial_data(request), ...) .

Комментарии:

1. что означает это ‘ ‘ в ‘first_name’: request.session.get(‘first_name’, ‘ ‘),? Должна ли она быть просто пустой?

2. Это означает значение по умолчанию, когда оно не установлено. Если она пуста, так и будет None , но я думаю, что пустая строка имеет больше смысла.

3. Я отредактировал свой вопрос, чтобы показать внесенные мной изменения. В нем говорится, что get_initial_data не является определенной переменной. Почему так?

4. Ах, поскольку вы определили функцию в классе, а не в глобальной области видимости, вам придется вызывать self.get_initial_data(request) вместо этого!

5. Кроме того, вместо того, чтобы делать form=RegForm(initial={...}); return form в функции, попробуйте просто вернуть словарь: return {...} .