#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 {...}
.