How to implement breadcrumbs in a Django template?

前端 未结 12 2083
無奈伤痛
無奈伤痛 2020-12-07 09:45

Some solutions provided on doing a Google search for \"Django breadcrumbs\" include using templates and block.super, basically just extending the base blocks and adding the

12条回答
  •  被撕碎了的回忆
    2020-12-07 10:16

    I've created template filter for this.

    Apply your custom filter (I've named it 'makebreadcrumbs') to the request.path like this:

    {% with request.resolver_match.namespace as name_space %}
        {{ request.path|makebreadcrumbs:name_space|safe }}
    {% endwith %}
    

    We need to pass url namespace as an arg to our filter.

    Also use safe filter, because our filter will be returning string that needs to be resolved as html content.

    Custom filter should look like this:

    @register.filter
    def makebreadcrumbs(value, arg):
        my_crumbs = []
        crumbs = value.split('/')[1:-1]  # slice domain and last empty value
        for index, c in enumerate(crumbs):
            if c == arg and len(crumbs) != 1:  
            # check it is a index of the app. example: /users/user/change_password - /users/ is the index.
                link = '{}'.format(reverse(c+':index'), c)
            else:
                if index == len(crumbs)-1:
                    link = '{}'.format(c)  
                    # the current bread crumb should not be a link.
                else:
                    link = '{}'.format(reverse(arg+':' + c), c)
            my_crumbs.append(link)
        return ' > '.join(my_crumbs)  
        # return whole list of crumbs joined by the right arrow special character.
    

    Important:

    splited parts of the 'value' in our filter should be equal to the namespace in the urls.py, so the reverse method can be called.

    Hope it helped.

提交回复
热议问题