Comment puis-je voir les noms d'URL actuels qui "inversent" la recherche?
J'appelle inverser dans une vue avec un argument que je pense devrait fonctionner, mais ne fonctionne pas. De toute façon, je peux vérifier ce qui est là et pourquoi mon motif n'est pas?
Si vous voulez une liste de toutes les URL de votre projet, vous devez d'abord installer Django-extensions , ajoutez-la à vos paramètres comme ceci:
INSTALLED_APPS = (
...
'Django_extensions',
...
)
Et puis, lancez cette commande dans votre terminal
./manage.py show_urls
Pour plus d'informations, vous pouvez consulter la documentation.
Essaye ça:
from Django.core.urlresolvers import get_resolver
get_resolver(None).reverse_dict.keys()
Il y a une recette sur activeestate
import urls
def show_urls(urllist, depth=0):
for entry in urllist:
print(" " * depth, entry.regex.pattern)
if hasattr(entry, 'url_patterns'):
show_urls(entry.url_patterns, depth + 1)
show_urls(urls.url_patterns)
J'utilise la commande suivante:
(Python3 + Django 1.10)
from Django.core.management import BaseCommand
from Django.conf.urls import RegexURLPattern, RegexURLResolver
from Django.core import urlresolvers
class Command(BaseCommand):
def add_arguments(self, parser):
pass
def handle(self, *args, **kwargs):
urls = urlresolvers.get_resolver()
all_urls = list()
def func_for_sorting(i):
if i.name is None:
i.name = ''
return i.name
def show_urls(urls):
for url in urls.url_patterns:
if isinstance(url, RegexURLResolver):
show_urls(url)
Elif isinstance(url, RegexURLPattern):
all_urls.append(url)
show_urls(urls)
all_urls.sort(key=func_for_sorting, reverse=False)
print('-' * 100)
for url in all_urls:
print('| {0.regex.pattern:20} | {0.name:20} | {0.lookup_str:20} | {0.default_args} |'.format(url))
print('-' * 100)
Utilisation:
./manage.py showurls
Exemple de sortie:
----------------------------------------------------------------------------------------------------
| ^(.+)/$ | | Django.views.generic.base.RedirectView | {} |
| ^(.+)/$ | | Django.views.generic.base.RedirectView | {} |
| ^(.+)/$ | | Django.views.generic.base.RedirectView | {} |
| ^(.+)/$ | | Django.views.generic.base.RedirectView | {} |
| ^(.+)/$ | | Django.views.generic.base.RedirectView | {} |
| ^(.+)/$ | | Django.views.generic.base.RedirectView | {} |
| ^static\/(?P<path>.*)$ | | Django.contrib.staticfiles.views.serve | {} |
| ^media\/(?P<path>.*)$ | | Django.views.static.serve | {'document_root': '/home/wlysenko/.virtualenvs/programmerHelper/project/media'} |
| ^(?P<app_label>polls|snippets|questions)/$ | app_list | apps.core.admin.AdminSite.app_index | {} |
| ^(?P<app_label>activity|articles|badges|books|comments|flavours|forum|marks|newsletters|notifications|opinions|polls|questions|replies|snippets|solutions|tags|testing|users|utilities|visits)/reports/$ | app_reports | apps.core.admin.AdminSite.reports_view | {} |
| ^(?P<app_label>activity|articles|badges|books|comments|flavours|forum|marks|newsletters|notifications|opinions|polls|questions|replies|snippets|solutions|tags|testing|users|utilities|visits)/statistics/$ | app_statistics | apps.core.admin.AdminSite.statistics_view | {} |
| articles/(?P<slug>[-\w]+)/$ | article | apps.articles.views.ArticleDetailView | {} |
| book/(?P<slug>[-_\w]+)/$ | book | apps.books.views.BookDetailView | {} |
| category/(?P<slug>[-_\w]+)/$ | category | apps.utilities.views.CategoryDetailView | {} |
| create/$ | create | apps.users.views.UserDetailView | {} |
| delete/$ | delete | apps.users.views.UserDetailView | {} |
| detail/(?P<email>\w+@[-_\w]+.\w+)/$ | detail | apps.users.views.UserDetailView | {} |
| snippet/(?P<slug>[-_\w]+)/$ | detail | apps.snippets.views.SnippetDetailView | {} |
| (?P<contenttype_model_pk>\d+)/(?P<pks_separated_commas>[-,\w]*)/$ | export | apps.export_import_models.views.ExportTemplateView | {} |
| download_preview/$ | export_preview_download | apps.export_import_models.views.ExportPreviewDownloadView | {} |
| ^$ | import | apps.export_import_models.views.ImportTemplateView | {} |
| result/$ | import_result | apps.export_import_models.views.ImportResultTemplateView | {} |
| ^$ | index | Django.contrib.admin.sites.AdminSite.index | {} |
| ^$ | index | apps.core.views.IndexView | {} |
| ^jsi18n/$ | javascript-catalog | Django.views.i18n.javascript_catalog | {'packages': ('your.app.package',)} |
| ^jsi18n/$ | jsi18n | Django.contrib.admin.sites.AdminSite.i18n_javascript | {} |
| level/(?P<slug>[-_\w]+)/$ | level | apps.users.views.UserDetailView | {} |
| ^login/$ | login | Django.contrib.admin.sites.AdminSite.login | {} |
| ^logout/$ | logout | Django.contrib.admin.sites.AdminSite.logout | {} |
| newsletter/(?P<slug>[_\w]+)/$ | newsletter | apps.newsletters.views.NewsletterDetailView | {} |
| newsletters/$ | newsletters | apps.newsletters.views.NewslettersListView | {} |
| notification/(?P<account_email>[-\w]+@[-\w]+.\w+)/$ | notification | apps.notifications.views.NotificationDetailView | {} |
| ^password_change/$ | password_change | Django.contrib.admin.sites.AdminSite.password_change | {} |
| ^password_change/done/$ | password_change_done | Django.contrib.admin.sites.AdminSite.password_change_done | {} |
| ^image/(?P<height>\d+)x(?P<width>\d+)/$ | placeholder | apps.core.views.PlaceholderView | {} |
| poll/(?P<pk>\w{8}-\w{4}-\w{4}-\w{4}-\w{12})/(?P<slug>[-\w]+)/$ | poll | apps.polls.views.PollDetailView | {} |
| ^add/$ | polls_choice_add | Django.contrib.admin.options.ModelAdmin.add_view | {} |
| ^(.+)/change/$ | polls_choice_change | Django.contrib.admin.options.ModelAdmin.change_view | {} |
| ^$ | polls_choice_changelist | Django.contrib.admin.options.ModelAdmin.changelist_view | {} |
| ^(.+)/delete/$ | polls_choice_delete | Django.contrib.admin.options.ModelAdmin.delete_view | {} |
| ^(.+)/history/$ | polls_choice_history | Django.contrib.admin.options.ModelAdmin.history_view | {} |
| ^add/$ | polls_poll_add | Django.contrib.admin.options.ModelAdmin.add_view | {} |
| ^(.+)/change/$ | polls_poll_change | Django.contrib.admin.options.ModelAdmin.change_view | {} |
| ^$ | polls_poll_changelist | Django.contrib.admin.options.ModelAdmin.changelist_view | {} |
| ^(.+)/delete/$ | polls_poll_delete | Django.contrib.admin.options.ModelAdmin.delete_view | {} |
| ^(.+)/history/$ | polls_poll_history | Django.contrib.admin.options.ModelAdmin.history_view | {} |
| ^$ | polls_vote_changelist | Django.contrib.admin.options.ModelAdmin.changelist_view | {} |
| publisher/(?P<slug>[-_\w]+)/$ | publisher | apps.books.views.PublisherDetailView | {} |
| question/(?P<slug>[-_\w]+)/$ | question | apps.questions.views.QuestionDetailView | {} |
| ^add/$ | questions_answer_add | Django.contrib.admin.options.ModelAdmin.add_view | {} |
| ^(.+)/change/$ | questions_answer_change | Django.contrib.admin.options.ModelAdmin.change_view | {} |
| ^$ | questions_answer_changelist | Django.contrib.admin.options.ModelAdmin.changelist_view | {} |
| ^(.+)/delete/$ | questions_answer_delete | Django.contrib.admin.options.ModelAdmin.delete_view | {} |
| ^(.+)/history/$ | questions_answer_history | Django.contrib.admin.options.ModelAdmin.history_view | {} |
| ^add/$ | questions_question_add | Django.contrib.admin.options.ModelAdmin.add_view | {} |
| ^(.+)/change/$ | questions_question_change | Django.contrib.admin.options.ModelAdmin.change_view | {} |
| ^$ | questions_question_changelist | Django.contrib.admin.options.ModelAdmin.changelist_view | {} |
| ^(.+)/delete/$ | questions_question_delete | Django.contrib.admin.options.ModelAdmin.delete_view | {} |
| ^(.+)/history/$ | questions_question_history | Django.contrib.admin.options.ModelAdmin.history_view | {} |
| ^setlang/$ | set_language | Django.views.i18n.set_language | {} |
| ^add/$ | snippets_snippet_add | Django.contrib.admin.options.ModelAdmin.add_view | {} |
| ^(.+)/change/$ | snippets_snippet_change | Django.contrib.admin.options.ModelAdmin.change_view | {} |
| ^$ | snippets_snippet_changelist | Django.contrib.admin.options.ModelAdmin.changelist_view | {} |
| ^(.+)/delete/$ | snippets_snippet_delete | Django.contrib.admin.options.ModelAdmin.delete_view | {} |
| ^(.+)/history/$ | snippets_snippet_history | Django.contrib.admin.options.ModelAdmin.history_view | {} |
| solution/(?P<pk>\w{8}-\w{4}-\w{4}-\w{4}-\w{12})/(?P<slug>[-_\w]+)/$ | solution | apps.solutions.views.SolutionDetailView | {} |
| suit/(?P<slug>[-\w]+)/$ | suit | apps.testing.views.SuitDetailView | {} |
| tag/(?P<name>[-_\w]+)/$ | tag | apps.tags.views.TagDetailView | {} |
| theme/(?P<slug>[-_\w]+)/$ | theme | apps.forum.views.SectionDetailView | {} |
| topic/(?P<slug>[-_\w]+)/$ | topic | apps.forum.views.TopicDetailView | {} |
| update/$ | update | apps.users.views.UserDetailView | {} |
| ^r/(?P<content_type_id>\d+)/(?P<object_id>.+)/$ | view_on_site | Django.contrib.contenttypes.views.shortcut | {} |
| writer/(?P<slug>[-_\w]+)/$ | writer | apps.books.views.WriterDetailView | {} |
----------------------------------------------------------------------------------------------------
Django 1.11, Python 2.7.6
cd to_your_Django_project
shell python manage.py
Puis collez le code suivant.
from Django.conf.urls import RegexURLPattern, RegexURLResolver
from Django.core import urlresolvers
urls = urlresolvers.get_resolver()
def if_none(value):
if value:
return value
return ''
def print_urls(urls, parent_pattern=None):
for url in urls.url_patterns:
if isinstance(url, RegexURLResolver):
print_urls(url, if_none(parent_pattern) + url.regex.pattern)
Elif isinstance(url, RegexURLPattern):
print if_none(parent_pattern) + url.regex.pattern
print_urls(urls)
Exemple de sortie:
^Django-admin/^$
^Django-admin/^login/$
^Django-admin/^logout/$
^Django-admin/^password_change/$
^Django-admin/^password_change/done/$
^Django-admin/^jsi18n/$
^Django-admin/^r/(?P<content_type_id>\d+)/(?P<object_id>.+)/$
^Django-admin/^wagtailimages/image/^$
^Django-admin/^wagtailimages/image/^add/$
^Django-admin/^wagtailimages/image/^(.+)/history/$
^Django-admin/^wagtailimages/image/^(.+)/delete/$
^Django-admin/^wagtailimages/image/^(.+)/change/$
^Django-admin/^wagtailimages/image/^(.+)/$
...
Il y a un plugin que j'utilise: https://github.com/Django-extensions/Django-extensions , il a une commande show_urls qui pourrait aider.
def get_resolved_urls(url_patterns):
url_patterns_resolved = []
for entry in url_patterns:
if hasattr(entry, 'url_patterns'):
url_patterns_resolved += get_resolved_urls(
entry.url_patterns)
else:
url_patterns_resolved.append(entry)
return url_patterns_resolved
En shell python manage.py
import urls
get_resolved_urls(urls.urlpatterns)
J'ai étendu commande de Seti pour afficher l'espace de noms, toutes les parties de l'URL, l'ajustement automatique de la largeur des colonnes, trié par (espace de noms, nom): https://Gist.github.com/andreif/263a3fa6e7c425297ffee09c25f66b20
import sys
from Django.core.management import BaseCommand
from Django.conf.urls import RegexURLPattern, RegexURLResolver
from Django.core import urlresolvers
def collect_urls(urls=None, namespace=None, prefix=None):
if urls is None:
urls = urlresolvers.get_resolver()
_collected = []
prefix = prefix or []
for x in urls.url_patterns:
if isinstance(x, RegexURLResolver):
_collected += collect_urls(x, namespace=x.namespace or namespace,
prefix=prefix + [x.regex.pattern])
Elif isinstance(x, RegexURLPattern):
_collected.append({'namespace': namespace or '',
'name': x.name or '',
'pattern': prefix + [x.regex.pattern],
'lookup_str': x.lookup_str,
'default_args': dict(x.default_args)})
else:
raise NotImplementedError(repr(x))
return _collected
def show_urls():
all_urls = collect_urls()
all_urls.sort(key=lambda x: (x['namespace'], x['name']))
max_lengths = {}
for u in all_urls:
for k in ['pattern', 'default_args']:
u[k] = str(u[k])
for k, v in list(u.items())[:-1]:
# Skip app_list due to length (contains all app names)
if (u['namespace'], u['name'], k) == \
('admin', 'app_list', 'pattern'):
continue
max_lengths[k] = max(len(v), max_lengths.get(k, 0))
for u in all_urls:
sys.stdout.write(' | '.join(
('{:%d}' % max_lengths.get(k, len(v))).format(v)
for k, v in u.items()) + '\n')
class Command(BaseCommand):
def handle(self, *args, **kwargs):
show_urls()
Remarque: l'ordre des colonnes est conservé dans Python 3.6 et il faudrait utiliser
OrderedDict
dans les versions antérieures.
Mise à jour: Une nouvelle version avec OrderedDict est maintenant installée dans le paquet Django - ???? s: https://github.com/5monkeys/Django-bananas/blob/master/bananas/management/commands/ show_urls.py
Il suffit de taper une URL que vous connaissez qui n'existe pas et le serveur renverra un message d'erreur avec une liste de modèles d'URL.
Par exemple, si vous utilisez un site à http: // localhost: 8000/quelque chose
Tapez
http: // localhost: 8000/quelquechose/blahNonsense , et votre serveur renvoie la liste de recherche d’URL et l’affiche dans le navigateur.
Solution minimaliste pour Django 2.0
Par exemple, si vous recherchez une URL sur la première application de installed_apps, vous pouvez y accéder comme suit:
from Django.urls import get_resolver
from pprint import pprint
pprint(
get_resolver().url_patterns[0].url_patterns
)
J'ai testé les autres réponses dans cet article et elles ne fonctionnaient pas avec Django 2.X, incomplètes ou trop complexes. Par conséquent, voici mon point de vue sur ceci:
from Django.conf import settings
from Django.urls import URLPattern, URLResolver
urlconf = __import__(settings.ROOT_URLCONF, {}, {}, [''])
def list_urls(lis, acc=None):
if acc is None:
acc = []
if not lis:
return
l = lis[0]
if isinstance(l, URLPattern):
yield acc + [str(l.pattern)]
Elif isinstance(l, URLResolver):
yield from list_urls(l.url_patterns, acc + [str(l.pattern)])
yield from list_urls(lis[1:], acc)
for p in list_urls(urlconf.urlpatterns):
print(''.join(p))
Ce code imprime toutes les URL, contrairement à certaines autres solutions, il imprimera le chemin complet et pas uniquement le dernier nœud. par exemple.:
admin/
admin/login/
admin/logout/
admin/password_change/
admin/password_change/done/
admin/jsi18n/
admin/r/<int:content_type_id>/<path:object_id>/
admin/auth/group/
admin/auth/group/add/
admin/auth/group/autocomplete/
admin/auth/group/<path:object_id>/history/
admin/auth/group/<path:object_id>/delete/
admin/auth/group/<path:object_id>/change/
admin/auth/group/<path:object_id>/
admin/auth/user/<id>/password/
admin/auth/user/
...