【问题标题】:Django request.GETDjango 请求.GET
【发布时间】:2011-03-30 20:59:49
【问题描述】:

似乎我无法让这个示例打印“你什么也没提交!”。 每次我提交一个空表单时,它都会说:

你提交了:u''

代替:

你什么也没提交!

我哪里做错了?

views.py

def search(request):
    if 'q' in request.GET:
        message = 'You submitted: %r' % request.GET['q']
    else:
        message = 'You submitted nothing!'

    return HttpResponse(message)

模板:

<html>
    <head>
        <title> Search </title>
    </head>
    <body>
        <form action="/search/"  method="get" >
        <input type="text" name = "q">
        <input type="submit"value="Search"/>
        </form>
    </body>
</html>

【问题讨论】:

    标签: django request


    【解决方案1】:

    调用/search/ 应该会导致“你什么也没提交”,但另一方面,调用/search/?q= 应该会导致“你提交了你”

    浏览器必须添加q=,即使它是空的,因为它们必须包含表单中的所有字段。仅当您在 Javascript 中进行一些 DOM 操作(或自定义 javascript 提交操作)时,您可能会得到这样的行为,但前提是用户启用了 javascript。所以你可能应该简单地测试非空字符串,例如:

    if request.GET.get('q'):
        message = 'You submitted: %r' % request.GET['q']
    else:
        message = 'You submitted nothing!'
    

    【讨论】:

    • 如果 q 在 dict 中不存在,这不会抛出异常吗?
    • 不,调用dict.get(key, default=None) 将返回为键存储的值,否则返回默认值。在这种情况下,None 被返回,u''None 都被计算为 False。因此,当您不希望抛出异常时,get() 是一种有用的方法。
    • 哦!你是对的,不知道我今天早上在想什么。
    • 好的。谢谢。不确定第二个 get 在这里做什么。但它奏效了。所以我现在就知道了。
    • 第二个get是python字典方法,避免在查找不存在的key时抛出异常。看看:imgur.com/a/0rp4Z36
    【解决方案2】:
    q = request.GET.get("q", None)
    if q:
        message = 'q= %s' % q
    else:
        message = 'Empty'
    

    【讨论】:

    • 谢谢,这对我有帮助
    【解决方案3】:

    由于您的表单有一个名为“q”的字段,将其留空仍会发送一个空字符串。

    试试

    if 'q' in request.GET and request.GET['q'] != "" :
         message
    else
         error message
    

    【讨论】:

    • if request.GET.get('q', '') != '' 更简单。
    【解决方案4】:

    在python中,None、0、""(空字符串)、False都接受None。

    所以:

    if request.GET['q']: // true if q contains anything but not ""
        message
    else : //// since this returns "" ant this is equals to None
        error
    

    【讨论】:

      【解决方案5】:

      这是一个很好的方法。

      from django.utils.datastructures import MultiValueDictKeyError
      try:
          message = 'You submitted: %r' % request.GET['q']
      except MultiValueDictKeyError:
          message = 'You submitted nothing!'
      

      如果 q 在 GET 请求中,您不需要再次检查。 QueryDict.get 中的调用已经对您执行此操作。

      【讨论】:

      • 异常 MultiValueDictKeyError --> 除了 MultiValueDictKeyError
      【解决方案6】:
      from django.http import QueryDict
      
      def search(request):
      if request.GET.\__contains__("q"):
          message = 'You submitted: %r' % request.GET['q']
      else:
          message = 'You submitted nothing!'
      return HttpResponse(message)
      

      使用这种方式,django官方文档推荐__contains__方法。见https://docs.djangoproject.com/en/1.9/ref/request-response/

      【讨论】:

        【解决方案7】:
        def search(request):
        if 'q' in request.GET.keys():
            message = 'You submitted: %r' % request.GET['q']
        else:
            message = 'You submitted nothing!'
        
        return HttpResponse(message)
        

        你也可以使用 if ... in。

        【讨论】:

          【解决方案8】:
          msg = request.GET.get('q','default')
          if (msg == default):
              message = "YOU SUBMITTED NOTHING"
          else: 
              message = "you submitted = %s" %msg"
          return HttpResponse(message);
          

          【讨论】:

            猜你喜欢
            • 2020-06-17
            • 1970-01-01
            • 2020-08-03
            • 1970-01-01
            • 2016-10-17
            • 2015-12-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多