Sat*_*dra 8 python django http request
概述
带有查询参数的 url 看起来像。
http://example.api.com/search/?name=jhon&age=26
Run Code Online (Sandbox Code Playgroud)
如果我使用django-filter,所有参数都会自动从请求中提取,并且它会返回一个过滤后的查询集。
视图.py
class SearchView(TemplateView):
template_name = "search.html"
def get_queryset(self):
return SearchFilter(request.GET, queryset=Model.objects.all()).qs
def get_context_data(self, **kwargs):
context = super(SearchView, self).get_context_data(**kwargs)
return context
Run Code Online (Sandbox Code Playgroud)
如果我想从 request.GET 手动提取它,我可以做到。
def get_queryset(self):
# extracting query parameter
q = self.request.GET.get('name')
Run Code Online (Sandbox Code Playgroud)
问题陈述
我的搜索网址看起来像
http://example.api.com/search/jhon-26
Run Code Online (Sandbox Code Playgroud)
我这样做是因为我不想向公众透露诸如“姓名”和“年龄”之类的键,这是为了安全抽象,这些是我的数据库表的列。
我正在进入jhon-26**kwargs,我想将其拆分并设置为 request.GET 的查询参数,以便我的过滤器类可以正常工作
题
有什么可以设置 request.GET 属性的吗?
# may be any set function available for this
self.request.GET.set('name', 'jhon')
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点。
Sat*_*dra 17
我在这里找到了将查询参数设置为 request.GET 的解决方案
由于 request.GET QueryDict 实例是不可变的,所以我们不能直接修改它,因此我们需要将其 _mutable 属性设置为 True
if not request.GET._mutable:
request.GET._mutable = True
# now you can edit it
request.GET['name'] = 'jhon'
request.GET['age'] = 26
Run Code Online (Sandbox Code Playgroud)