Improve url handling within the navbar
This commit is contained in:
parent
0b59b4b140
commit
22f7f217cf
2 changed files with 20 additions and 14 deletions
|
@ -1,5 +1,5 @@
|
||||||
{% load static %}<nav class="navbar navbar-expand-lg navbar-light" id="mainNav">
|
{% load static %}<nav class="navbar navbar-expand-lg navbar-light" id="mainNav">
|
||||||
<a class="navbar-brand" href="/{{ current_lang_code }}/">
|
<a class="navbar-brand" href="{% url 'index' %}">
|
||||||
<img src="{% static "images/icon_khaganat.png" %}" alt="Khaganat">
|
<img src="{% static "images/icon_khaganat.png" %}" alt="Khaganat">
|
||||||
</a>
|
</a>
|
||||||
<div class="collapse navbar-collapse" id="navbarNav">
|
<div class="collapse navbar-collapse" id="navbarNav">
|
||||||
|
@ -32,10 +32,10 @@
|
||||||
</div>
|
</div>
|
||||||
<ul class="navbar-nav flex-row ml-md-auto d-none d-md-flex">
|
<ul class="navbar-nav flex-row ml-md-auto d-none d-md-flex">
|
||||||
<li class="nav-item dropdown">
|
<li class="nav-item dropdown">
|
||||||
<a class="nav-item nav-link dropdown-toggle mr-md-2" href="#" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">{{ current_lang_name }}</a>
|
<a class="nav-item nav-link dropdown-toggle mr-md-2" href="#" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">{{ current_lang_name|capfirst }}</a>
|
||||||
<div class="dropdown-menu dropdown-menu-right">
|
<div class="dropdown-menu dropdown-menu-right">
|
||||||
{% for lang_code, lang_name in all_langs %}
|
{% for lang_code, lang_name, lang_url in all_langs %}
|
||||||
<a class="dropdown-item{% if lang_code == current_lang_code %} active{% endif %}" href="/{{ lang_code }}/{{ current_url }}">{{ lang_name }}</a>
|
<a class="dropdown-item{% if lang_code == current_lang_code %} active{% endif %}" href="{{ lang_url }}">{{ lang_name|capfirst }}</a>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
|
|
|
@ -1,8 +1,10 @@
|
||||||
from django.utils.translation import activate as activate_lang
|
from django.utils.translation import get_language_info
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
from django.utils.translation import activate as activate_lang
|
||||||
from django.utils.translation import get_language
|
from django.utils.translation import get_language
|
||||||
from django.template.response import TemplateResponse
|
from django.template.response import TemplateResponse
|
||||||
from django.utils.safestring import mark_safe
|
from django.utils.safestring import mark_safe
|
||||||
|
from django.urls import reverse, resolve
|
||||||
from django.shortcuts import render
|
from django.shortcuts import render
|
||||||
from navbar.models import Element
|
from navbar.models import Element
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
|
@ -15,13 +17,17 @@ path_re = re.compile('^(/[a-z]+)/(.*)')
|
||||||
|
|
||||||
|
|
||||||
def get_lang_name(lang_code):
|
def get_lang_name(lang_code):
|
||||||
|
li = get_language_info(lang_code)
|
||||||
|
return li['name_local']
|
||||||
|
|
||||||
|
|
||||||
|
def get_lang_data(request, lang_code, curr_lang):
|
||||||
|
lang_name = get_lang_name(lang_code)
|
||||||
|
rm = resolve(request.path_info)
|
||||||
activate_lang(lang_code)
|
activate_lang(lang_code)
|
||||||
return str([e for e in settings.LANGUAGES if e[0] == lang_code].pop()[1])
|
lang_url = reverse(rm.func, args=rm.args, kwargs=rm.kwargs)
|
||||||
|
activate_lang(curr_lang)
|
||||||
|
return (lang_code, lang_name, lang_url)
|
||||||
def reduce_path(path):
|
|
||||||
m = path_re.match(path)
|
|
||||||
return m.group(2) if m else path
|
|
||||||
|
|
||||||
|
|
||||||
@register.simple_tag(takes_context=True)
|
@register.simple_tag(takes_context=True)
|
||||||
|
@ -30,11 +36,11 @@ def navbar(context):
|
||||||
curr_lang = get_language()
|
curr_lang = get_language()
|
||||||
ctx = {
|
ctx = {
|
||||||
'elems': Element.objects.filter(parent=None).order_by('weight'),
|
'elems': Element.objects.filter(parent=None).order_by('weight'),
|
||||||
'current_url': reduce_path(request.path_info),
|
|
||||||
'current_lang_code': curr_lang,
|
'current_lang_code': curr_lang,
|
||||||
'current_lang_name': get_lang_name(curr_lang),
|
'current_lang_name': get_lang_name(curr_lang),
|
||||||
'all_langs': [(l[0], get_lang_name(l[0])) for l in settings.LANGUAGES],
|
'all_langs': [
|
||||||
|
get_lang_data(request, l[0], curr_lang) for l in settings.LANGUAGES
|
||||||
|
],
|
||||||
}
|
}
|
||||||
activate_lang(curr_lang)
|
|
||||||
tpl = TemplateResponse(request, 'navbar/navbar.html', context=ctx).render()
|
tpl = TemplateResponse(request, 'navbar/navbar.html', context=ctx).render()
|
||||||
return mark_safe(tpl.rendered_content)
|
return mark_safe(tpl.rendered_content)
|
||||||
|
|
Loading…
Reference in a new issue