在django中,如何区分从HTML表单提交的HTTP请求和从客户端提交的HTTP请求?
我在django有一个模型,如下所示:在django中,如何区分从HTML表单提交的HTTP请求和从客户端提交的HTTP请求?,django,forms,http,get,request,Django,Forms,Http,Get,Request,我在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">
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})
<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})
我有以下表格:
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})
<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})
我的模板如下:
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})
<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})
此方法的问题是,如果sb提交表单时未填写国籍字段,则结果将是“从客户端请求获取”,这是错误的,因为验证错误应该发生,因为请求是从提交表单而不是直接从客户端获取请求。
我所能做的是在我的表单中添加一个隐藏字段,如下所示:
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})
<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中应该有一些东西告诉我们请求是来自客户端的新get请求,或者是来自表单提交。我在找这个。
请求。GET
是一本字典request.GET.GET('nationality')
如果字典没有键'nationality'
,但如果其值是空字符串(?nationality=
),则它是错误的。因此,您只需检查密钥是否存在,这样您就知道表单已提交:
if 'nationality' in request.GET:
# initialise form with `request.GET`
else:
# initial unbound form
若要提交包含数据的表单,方法应为“post”,若request.method为“post”,则应检查表单中提交的数据因为我想将表单数据传输到下一页,在下一页中有一个更大的表单,该表单应该部分地预先填充主页表单的数据,并且在下一页中也有不同的场景(直接从客户端获取、提交页面表单以及提交第二页分页页面表单),我需要使用get方法。使用get发送非敏感数据没有问题。部分原因在这里解释:“if request.get.get('national')”如果这是真的,那么form.is\u valid将是真的,因为我认为nationallity是表单中唯一的字段。检查print(request.GET.GET('national'))的值,检查什么“print(request.GET.GET('national')”正在打印。您没有注意到主要问题。由于模型中的null和blank为false,因此模型表单验证要求提交的表单填写国籍(带有sth)。这就是我想要的!!!但是,如果sb提交按钮时没有填写国籍字段,则会发生以下情况:``否则:student\u form=StudentForm()print('get from client request')返回render(request,my\u template,{'student\u form':student\u form})``这不是我想要的。