我目前定义的经常表现在以捕捉的参数,在一个网址,作为所描述的教程。我怎么接参数,从该网址的一部分 HttpRequest 对象?我 HttpRequest.GET 目前返回的一个空的 QueryDict 对象。

我想学习如何做到这一点没有一个图书馆,所以我可以去了解决好。

有帮助吗?

解决方案

当网址如下:domain/search/?q=haha 时,  然后你会使用request.GET.get('q', '')

q是您想要的参数,如果找不到'',则URLconf是默认值。

但是,如果您只是配置regex ,那么views.py中的捕获将作为参数(或命名参数)传递给函数。

如:

(r'^user/(?P<username>\w{0,50})/$', views.profile_page,),

然后在你的<=>中你会有

def profile_page(request, username):
    # Rest of the method

其他提示

澄清camflan的解释,让我们假设你已经

  • 该规则 url(regex=r'^user/(?P<username>\w{1,50})/$', view='views.profile_page')
  • 一个在进入要求 http://domain/user/thaiyoshi/?message=Hi

URL调度程序规则将会赶上的部件的网址 路径 (在这里 "user/thaiyoshi/"),并通过他们的图功能与请求的对象。

Query string(这里 message=Hi)是分析和参数被保存作为一个 QueryDictrequest.GET.没有进一步的匹配或处理HTTP获得的参数。

这个图功能,将使用两个部分提取的URL路径和查询参数:

def profile_page(request, username=None):
    user = User.objects.get(username=username)
    message = request.GET.get('message')

作为一个侧面说明,你会找到的请求的方法(在这种情况下 "GET", 和提交形式通常 "POST")在 request.method.在某些情况下它是用来检查它配什么你期待的。

更新: 在决定是否使用的网址路径或查询的参数,用于传递信息,下面可能会有所帮助:

  • 使用URL路径独特的识别资源,例如 /blog/post/15/ (不 /blog/posts/?id=15)
  • 使用的查询参数改变的方式的资源显示的,例如 /blog/post/15/?show_comments=1/blog/posts/2008/?sort_by=date&direction=desc
  • 使人类的友好的网址,避免使用身份证号码和使用例如日期、类别和/或蛞蝓: /blog/post/2008/09/30/django-urls/

使用GET

request.GET["id"]

使用POST

request.POST["id"]
def some_view(request, *args, **kwargs):
    if kwargs.get('q', None):
        # Do something here ..

我想分享一个可能为您省时的提示。
如果您打算在 urls.py 文件中使用类似的内容:

url(r'^(?P<username>\w+)/

这基本上意味着 www.example.com/<username> 。请务必将其放在您的网址条目的末尾,否则,它很容易导致与下面的网址条目冲突,即访问其中一个给您一个很好的错误:<代码>用户匹配查询不存在。

我自己刚刚体验过它;希望它有所帮助!

, views.profile_page,),

这基本上意味着 www.example.com/<username> 。请务必将其放在您的网址条目的末尾,否则,它很容易导致与下面的网址条目冲突,即访问其中一个给您一个很好的错误:<代码>用户匹配查询不存在。

我自己刚刚体验过它;希望它有所帮助!

对于只有 request 对象的情况,您可以使用 request.parser_context ['kwargs'] ['your_param']

如果您的网址如下所示,您有两种常用方法:

https://domain/method/?a=x&b=y

V1:

如果特定密钥是强制性的,您可以使用:

key_a = request.GET['a']

如果密钥存在,则返回 a 的值,否则返回异常。

V2:

如果您的钥匙是可选的:

request.GET.get('a')

你可以尝试不带任何参数,这不会崩溃。 所以你可以用 try:except:包装它,并在示例中返回 HttpResponseBadRequest()。 这是一种简单的方法,可以使代码不那么复杂,而无需使用特殊的异常处理。

这不是您要求的,但此代码段有助于管理< templates 中的code> query_strings 。

我想在这里添加一些我自己的选项。有人会想知道如何在urls.py中设置路径,例如

domain/search/?q=CA

这样我们就可以调用查询了。

事实是,没有必要在urls.py中设置这样的路由。您需要设置的只是urls.py中的路径

urlpatterns = [
    path('domain/search/', views.CityListView.as_view()),
]

当您输入 http:// servername:port / domain / search /?q = CA 。查询部分'?q = CA'将自动保留在您可以引用的哈希表中

request.GET.get('q', None).

这是一个例子(views.py)

class CityListView(generics.ListAPIView):
    serializer_class = CityNameSerializer

    def get_queryset(self):
        if self.request.method == 'GET':
            queryset = City.objects.all()
            state_name = self.request.GET.get('q', None)
            if state_name is not None:
                queryset = queryset.filter(state__name=state_name)
            return queryset

此外,在Url中编写查询字符串时

http://servername:port/domain/search/?q=CA

不要将查询字符串包装在引号中,例如

http://servername:port/domain/search/?q="CA"
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top