|
| 1 | +title: django.urls get_resolver Example Code |
| 2 | +category: page |
| 3 | +slug: django-urls-get-resolver-examples |
| 4 | +sortorder: 500011404 |
| 5 | +toc: False |
| 6 | +sidebartitle: django.urls get_resolver |
| 7 | +meta: Python example code for the get_resolver callable from the django.urls module of the Django project. |
| 8 | + |
| 9 | + |
| 10 | +get_resolver is a callable within the django.urls module of the Django project. |
| 11 | + |
| 12 | + |
| 13 | +## Example 1 from django-cms |
| 14 | +[django-cms](https://github.com/divio/django-cms) |
| 15 | +([project website](https://www.django-cms.org/en/)) is a Python-based |
| 16 | +content management system (CMS) [library](https://pypi.org/project/django-cms/) |
| 17 | +for use with Django web apps that is open sourced under the |
| 18 | +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) |
| 19 | +license. |
| 20 | + |
| 21 | +[**django-cms / cms / utils / i18n.py**](https://github.com/divio/django-cms/blob/develop/cms/utils/i18n.py) |
| 22 | + |
| 23 | +```python |
| 24 | +# i18n.py |
| 25 | +from contextlib import contextmanager |
| 26 | + |
| 27 | +from django.conf import settings |
| 28 | +from django.utils import translation |
| 29 | +from django.utils.translation import ugettext_lazy as _ |
| 30 | +~~from django.urls import get_resolver |
| 31 | + |
| 32 | +from cms.exceptions import LanguageError |
| 33 | +from cms.utils.compat.dj import LocalePrefixPattern |
| 34 | +from cms.utils.conf import get_cms_setting, get_site_id |
| 35 | + |
| 36 | + |
| 37 | +@contextmanager |
| 38 | +def force_language(new_lang): |
| 39 | + old_lang = get_current_language() |
| 40 | + if old_lang != new_lang: |
| 41 | + translation.activate(new_lang) |
| 42 | + yield |
| 43 | + translation.activate(old_lang) |
| 44 | + |
| 45 | + |
| 46 | +def get_languages(site_id=None): |
| 47 | + site_id = get_site_id(site_id) |
| 48 | + result = get_cms_setting('LANGUAGES').get(site_id) |
| 49 | + if not result: |
| 50 | + result = [] |
| 51 | + defaults = get_cms_setting('LANGUAGES').get('default', {}) |
| 52 | + for code, name in settings.LANGUAGES: |
| 53 | + lang = {'code': code, 'name': _(name)} |
| 54 | + lang.update(defaults) |
| 55 | + |
| 56 | + |
| 57 | +## ... source file abbreviated to get to get_resolver examples ... |
| 58 | + |
| 59 | + |
| 60 | + |
| 61 | +def get_fallback_languages(language, site_id=None): |
| 62 | + try: |
| 63 | + language = get_language_object(language, site_id) |
| 64 | + except LanguageError: |
| 65 | + language = get_languages(site_id)[0] |
| 66 | + return language.get('fallbacks', []) |
| 67 | + |
| 68 | + |
| 69 | +def get_redirect_on_fallback(language, site_id=None): |
| 70 | + language = get_language_object(language, site_id) |
| 71 | + return language.get('redirect_on_fallback', True) |
| 72 | + |
| 73 | + |
| 74 | +def hide_untranslated(language, site_id=None): |
| 75 | + obj = get_language_object(language, site_id) |
| 76 | + return obj.get('hide_untranslated', True) |
| 77 | + |
| 78 | + |
| 79 | +def is_language_prefix_patterns_used(): |
| 80 | + return any( |
| 81 | + isinstance( |
| 82 | + getattr(url_pattern, 'pattern', url_pattern), |
| 83 | + LocalePrefixPattern |
| 84 | + ) |
| 85 | +~~ for url_pattern in get_resolver(None).url_patterns |
| 86 | + ) |
| 87 | + |
| 88 | + |
| 89 | +def is_valid_site_language(language, site_id): |
| 90 | + return language in get_language_list(site_id) |
| 91 | + |
| 92 | + |
| 93 | + |
| 94 | +## ... source file continues with no further get_resolver examples... |
| 95 | + |
| 96 | +``` |
| 97 | + |
| 98 | + |
| 99 | +## Example 2 from django-sitetree |
| 100 | +[django-sitetree](https://github.com/idlesign/django-sitetree) |
| 101 | +([project documentation](https://django-sitetree.readthedocs.io/en/latest/) |
| 102 | +and |
| 103 | +[PyPI package information](https://pypi.org/project/django-sitetree/)) |
| 104 | +is a [Django](/django.html) extension that makes it easier for |
| 105 | +developers to add site trees, menus and breadcrumb navigation elements |
| 106 | +to their web applications. |
| 107 | + |
| 108 | +The django-sitetree project is provided as open source under the |
| 109 | +[BSD 3-Clause "New" or "Revised" License](https://github.com/idlesign/django-sitetree/blob/master/LICENSE). |
| 110 | + |
| 111 | +[**django-sitetree / sitetree / admin.py**](https://github.com/idlesign/django-sitetree/blob/master/sitetree/./admin.py) |
| 112 | + |
| 113 | +```python |
| 114 | +# admin.py |
| 115 | +from typing import Tuple, Type, Optional |
| 116 | + |
| 117 | +from django import forms |
| 118 | +from django.conf import settings as django_settings |
| 119 | +from django.conf.urls import url |
| 120 | +from django.contrib import admin |
| 121 | +from django.contrib import messages |
| 122 | +from django.contrib.admin.sites import NotRegistered |
| 123 | +from django.http import HttpResponseRedirect, HttpRequest, HttpResponse |
| 124 | +~~from django.urls import get_urlconf, get_resolver |
| 125 | +from django.utils.translation import gettext_lazy as _ |
| 126 | + |
| 127 | +from .fields import TreeItemChoiceField |
| 128 | +from .settings import MODEL_TREE, MODEL_TREE_ITEM |
| 129 | +from .utils import get_tree_model, get_tree_item_model, get_app_n_model |
| 130 | + |
| 131 | +if False: # pragma: nocover |
| 132 | + from .models import TreeItemBase, TreeBase # noqa |
| 133 | + |
| 134 | + |
| 135 | +SMUGGLER_INSTALLED = 'smuggler' in django_settings.INSTALLED_APPS |
| 136 | + |
| 137 | +MODEL_TREE_CLASS = get_tree_model() |
| 138 | +MODEL_TREE_ITEM_CLASS = get_tree_item_model() |
| 139 | + |
| 140 | +_TREE_ADMIN = lambda: TreeAdmin |
| 141 | +_ITEM_ADMIN = lambda: TreeItemAdmin |
| 142 | + |
| 143 | + |
| 144 | +def get_model_url_name(model_nfo: Tuple[str, str], page: str, with_namespace: bool = False) -> str: |
| 145 | + prefix = '' |
| 146 | + if with_namespace: |
| 147 | + prefix = 'admin:' |
| 148 | + return (f'{prefix}%s_{page}' % '%s_%s' % model_nfo).lower() |
| 149 | + |
| 150 | + |
| 151 | +## ... source file abbreviated to get to get_resolver examples ... |
| 152 | + |
| 153 | + |
| 154 | + elif '_continue' in request.POST: |
| 155 | + return response |
| 156 | + |
| 157 | + return HttpResponseRedirect('') |
| 158 | + |
| 159 | + def response_add(self, request, obj, post_url_continue=None, **kwargs): |
| 160 | + if post_url_continue is None: |
| 161 | + post_url_continue = f'../item_{obj.pk}/' |
| 162 | + |
| 163 | + return self._redirect(request, super().response_add(request, obj, post_url_continue)) |
| 164 | + |
| 165 | + def response_change(self, request, obj, **kwargs): |
| 166 | + return self._redirect(request, super().response_change(request, obj)) |
| 167 | + |
| 168 | + def get_form(self, request, obj=None, **kwargs): |
| 169 | + if obj is not None and obj.parent is not None: |
| 170 | + self.previous_parent = obj.parent |
| 171 | + |
| 172 | + form = super().get_form(request, obj, **kwargs) |
| 173 | + form.base_fields['parent'].choices_init(self.tree) |
| 174 | + |
| 175 | + if not getattr(self, 'known_url_names', False): |
| 176 | + self.known_url_names = [] |
| 177 | + self.known_url_rules = [] |
| 178 | + |
| 179 | +~~ resolver = get_resolver(get_urlconf()) |
| 180 | + |
| 181 | + for ns, (url_prefix, ns_resolver) in resolver.namespace_dict.items(): |
| 182 | + if ns != 'admin': |
| 183 | + self._stack_known_urls(ns_resolver.reverse_dict, ns) |
| 184 | + |
| 185 | + self._stack_known_urls(resolver.reverse_dict) |
| 186 | + self.known_url_rules = sorted(self.known_url_rules) |
| 187 | + |
| 188 | + form.known_url_names_hint = _( |
| 189 | + 'You are seeing this warning because "URL as Pattern" option is active and pattern entered above ' |
| 190 | + 'seems to be invalid. Currently registered URL pattern names and parameters: ') |
| 191 | + |
| 192 | + form.known_url_names = self.known_url_names |
| 193 | + form.known_url_rules = self.known_url_rules |
| 194 | + |
| 195 | + return form |
| 196 | + |
| 197 | + def _stack_known_urls(self, reverse_dict, ns=None): |
| 198 | + for url_name, url_rules in reverse_dict.items(): |
| 199 | + if isinstance(url_name, str): |
| 200 | + if ns is not None: |
| 201 | + url_name = f'{ns}:{url_name}' |
| 202 | + self.known_url_names.append(url_name) |
| 203 | + self.known_url_rules.append(f"<b>{url_name}</b> {' '.join(url_rules[0][0][1])}") |
| 204 | + |
| 205 | + |
| 206 | +## ... source file continues with no further get_resolver examples... |
| 207 | + |
| 208 | +``` |
| 209 | + |
0 commit comments