【问题标题】:How to differentiate an HTTP Request submitted from a HTML form and a HTTP Request submitted from a client in django?如何区分从 HTML 表单提交的 HTTP 请求和从 django 中的客户端提交的 HTTP 请求?
【发布时间】:2020-01-25 05:55:21
【问题描述】:

我在 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 中应该有一些东西告诉我们请求是来自客户端的新获取请求还是来自表单提交。我正在找这个。

【问题讨论】:

  • 如果要提交带数据的表单,方法应该是“post”,如果request.method是“POST”,应该检查表单中提交的数据
  • 因为我想把表单数据转移到下一页,其中有一个更大的表单应该部分预填充主页表单的数据,并且在下一个有不同的场景页面(直接从客户端新鲜获取,页面的表单提交,还有第二页分页页面的表单提交),我需要使用GET方法。使用 GET 发送非敏感数据没有问题。部分原因在这里解释:stackoverflow.com/questions/57941731/…
  • "if request.GET.get('nationality')" 如果这是真的,那么 form.is_valid 将是真的,因为我认为国籍只是表单中的字段。检查 print(request.GET.get('nationality')) 的值
  • 检查“print(request.GET.get('nationality'))”正在打印什么。
  • 您没有注意到主要问题。由于模型中null和blank为false,模型表单验证要求提交的表单填写国籍(with sth)。这就是我想要的!!!但是,如果 sb 在没有填写国籍字段的情况下提交按钮,则会发生这种情况: ``` else: student_form = StudentForm() print('get from client request') return render(request, my_template, {'student_form': student_form} ) ``` 这不是我想要的。

标签: django forms http get request


【解决方案1】:

request.GET 是一个字典。如果字典没有键 'nationality' 但如果它的值是空字符串 (?nationality=),request.GET.get('nationality') 是假的。因此,您应该只检查密钥的存在,这样您就知道表单已提交:

if 'nationality' in request.GET:
    # initialise form with `request.GET`
else:
    # initial unbound form

【讨论】:

    猜你喜欢
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 2017-11-04
    • 2019-08-26
    • 2018-03-09
    • 1970-01-01
    • 2018-05-16
    • 1970-01-01
    相关资源
    最近更新 更多