Django: get URL of current page, including parameters, in a template

前端 未结 6 1218
忘了有多久
忘了有多久 2020-12-01 00:05

Is there a way to get the current page URL and all its parameters in a Django template?

For example, a templatetag that would print a full URL like /foo/bar?p

相关标签:
6条回答
  • 2020-12-01 00:19

    In a file context_processors.py (or the like):

    def myurl( request ):
      return { 'myurlx': request.get_full_path() }
    

    In settings.py:

    TEMPLATE_CONTEXT_PROCESSORS = (
      ...
      wherever_it_is.context_processors.myurl,
      ...
    

    In your template.html:

    myurl={{myurlx}}
    
    0 讨论(0)
  • 2020-12-01 00:32

    Write a custom context processor. e.g.

    def get_current_path(request):
        return {
           'current_path': request.get_full_path()
         }
    

    add a path to that function in your TEMPLATE_CONTEXT_PROCESSORS settings variable, and use it in your template like so:

    {{ current_path }}
    

    If you want to have the full request object in every request, you can use the built-in django.core.context_processors.request context processor, and then use {{ request.get_full_path }} in your template.

    See:

    • Custom Context Processors
    • HTTPRequest's get_full_path() method.
    0 讨论(0)
  • 2020-12-01 00:35

    In addtition to sdolan's answer:

    if you are using I18N and would like to pass next value to /i18n/setlang/ to change the language of the current page, then you will need to strip off current language code from the full path either. Something like:

    full_path = request.get_full_path()
    current_path = full_path[full_path.index('/', 1):]
    

    This assumes that every path has format /LANG_CODE/any/other/stuff/with/?param='yay' and simply kicks off LANG_CODE whatever it is (e.g., /en/ will result into /).

    0 讨论(0)
  • 2020-12-01 00:39

    Use Django's build in context processor to get the request in template context. In settings add request processor to TEMPLATE_CONTEXT_PROCESSORS

    TEMPLATE_CONTEXT_PROCESSORS = (
    
        # Put your context processors here
    
        'django.core.context_processors.request',
    )
    

    And in template use:

    {{ request.get_full_path }}
    

    This way you do not need to write any new code by yourself.

    0 讨论(0)
  • 2020-12-01 00:43

    You can see if your url differs from the others.

    {% if 'foo/bar/' in request.get_full_path %}
    
    0 讨论(0)
  • 2020-12-01 00:46

    Django has a lot of built-in stuff, but if you don't explicit what do you want to use, it won't be used.

    So, in MTV schema (Model, Template, View) the view receives a request and uses a template render to generate a response, passing on it a dictionary or all local variables (using the locals() function) of this view. Knowing this, we can insert the current url that came from the response, like this:

    views.py:

    from django.shortcuts import render
    
    def page(request):
        currentUrl = request.get_full_path()
        return render(request, 'app/page.html', locals())
    

    Then, in the template 'app/page.html' you just have to do the following to display the currentUrl variable that we just created and passed through via locals():

    app/template/page.html:

    {{ currentUrl }}
    
    0 讨论(0)
提交回复
热议问题