У меня есть модель в django, как показано ниже:
class Student(Model):
nationality = CharField(max_length=200)
У меня есть форма, как показано ниже:
class StudentForm(ModelForm):
class Meta:
model = Student
fields = ('nationality', )
мой шаблон выглядит так:
<form method="GET" novalidate id="my_form">
{{ student_form.as_p }}
</form>
<button type="submit" form="my_form" name="my_form">Submit</button>
У меня есть представление, как показано ниже:
def home(request):
if request.POST:
return HttpResponse('This should never happen')
else:
if request.GET.get('nationality'):
student_form = StudentForm(request.GET)
if student_form.is_valid():
return HttpResponse('get from form submission')
else:
student_form = StudentForm()
print('get from client request')
return render(request, my_template, {'student_form': student_form})
Проблема с этим методом заключается в том, что если sb отправит форму без заполнения поля национальности, результатом будет «получить из запроса клиента», то естьневерно, потому что ошибка проверки должна произойти, потому что запрос от отправки формы, а не прямой клиент получить запрос.Что я могу сделать, так это добавить скрытое поле в форму, как показано ниже:
<form method="GET" novalidate id="my_form">
{{ student_form.as_p }}
<input type="hidden" id="hidden" name="hidden" value="hidden">
</form>
<button type="submit" form="my_form" name="my_form">Submit</button>
и изменить свое представление, как показано ниже:
def home(request):
if request.POST:
return HttpResponse('This should never happen')
else:
if request.GET.get('hidden'):
student_form = StudentForm(request.GET)
if student_form.is_valid():
return HttpResponse('get from form submission')
else:
student_form = StudentForm()
print('get from client request')
return render(request, my_template, {'student_form': student_form})
Однако должен быть другой метод длясделай это.В HTTP должно быть что-то, что говорит нам о том, что запрос является новым запросом от клиента или отправлен из формы.Я ищу это.