Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在django中,如何区分从HTML表单提交的HTTP请求和从客户端提交的HTTP请求?_Django_Forms_Http_Get_Request - Fatal编程技术网

在django中,如何区分从HTML表单提交的HTTP请求和从客户端提交的HTTP请求?

在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">

我在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}) 
<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})``这不是我想要的。