可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I am currently defining regular expressions in order to capture parameters in a url, as described in the tutorial. How do I access parameters from the url as part the HttpRequest
object? My HttpRequest.GET
currently returns an empty QueryDict
object.
I\'d like to learn how to do this without a library so I can get to know Django better.
回答1:
When url is like: domain/search/?q=haha
,
Then you would use request.GET.get(\'q\', \'\')
.
q
is the parameter you want, And \'\'
is the default value if q
isn\'t found.
However, if you are instead just configuring your URLconf
, Then your captures from the regex
are passed to the function as arguments (or named arguments).
Such as:
(r\'^user/(?P<username>\\w{0,50})/$\', views.profile_page,),
Then in your views.py
you would have
def profile_page(request, username):
# Rest of the method
回答2:
To clarify camflan\'s explanation, let\'s suppose you have
- the rule
url(regex=r\'^user/(?P<username>\\w{1,50})/$\', view=\'views.profile_page\')
- a in incoming request for
http://domain/user/thaiyoshi/?message=Hi
The URL dispatcher rule will catch parts of the URL path (here \"user/thaiyoshi/\"
) and pass them to the view function along with the request object.
The query string (here message=Hi
) is parsed and parameters are stored as a QueryDict
in request.GET
. No further matching or processing for HTTP GET parameters is done.
This view function would use both parts extracted from the URL path and a query parameter:
def profile_page(request, username=None):
user = User.objects.get(username=username)
message = request.GET.get(\'message\')
As a side note, you\'ll find the request method (in this case \"GET\"
, and for submitted forms usually \"POST\"
) in request.method
. In some cases it\'s useful to check that it matches what you\'re expecting.
Update: When deciding whether to use the URL path or the query parameters for passing information, the following may help:
- use the URL path for uniquely identifying resources, e.g.
/blog/post/15/
(not /blog/posts/?id=15
)
- use query parameters for changing the way the resource is displayed, e.g.
/blog/post/15/?show_comments=1
or /blog/posts/2008/?sort_by=date&direction=desc
- to make human friendly URLs, avoid using ID numbers and use e.g. dates, categories and/or slugs:
/blog/post/2008/09/30/django-urls/
回答3:
Using GET
request.GET[\"id\"]
Using POST
request.POST[\"id\"]
回答4:
def some_view(request, *args, **kwargs):
if kwargs.get(\'q\', None):
# Do something here ..
回答5:
I would like to share a tip that may save you some time.
If you plan to use something like this in your urls.py
file:
url(r\'^(?P<username>\\w+)/$\', views.profile_page,),
Which basically means www.example.com/<username>
. Be sure to place it at the end of your URL entries, because otherwise, it is prone to cause conflicts with the URL entries that follow below, i.e. accessing one of them will give you the nice error: User matching query does not exist.
I\'ve just experienced it myself; hope it helps!
回答6:
This is not exactly what you asked for, but this snippet is helpful for managing query_strings
in templates
.
回答7:
You have two common ways to do that in case your url looks like that:
https://domain/method/?a=x&b=y
v1:
If specific key is mandatory you can use:
key_a = request.GET[\'a\']
This will return a value of a
if key exists and an Exception if not.
v2:
If your keys are optional:
request.GET.get(\'a\')
You can try that without any argument this will not crash.
So you can wrap it with try: except:
and return HttpResponseBadRequest()
in example.
This is a simple way to make your code less complex, without using special Exceptions handling.
回答8:
For situations where you only have the request
object you can use request.parser_context[\'kwargs\'][\'your_param\']
回答9:
I\'d like to add some option of myself, here. Someone would wonder how to set path in urls.py, such as
domain/search/?q=CA
so that we could invoke query.
The fact is that it is NOT necessary to set such a route in urls.py. What you need to set is just the route in urls.py
urlpatterns = [
path(\'domain/search/\', views.CityListView.as_view()),
]
and when you input http://servername:port/domain/search/?q=CA. The query part \'?q=CA\' will be automatically reserved in the hash table which you can reference though
request.GET.get(\'q\', None).
Here is an example (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
In addition, when you write query string in Url
http://servername:port/domain/search/?q=CA
Do not wrap query string in quotes e.g
http://servername:port/domain/search/?q=\"CA\"