2015-07-31 1 views
0

Итак, я создаю довольно простой сайт, который позволяет пользователям создавать и редактировать профили. Я нахожусь в процессе создания URL-адрес для сайта, которые следуют следующим «правилам»:URL-адреса маршрутизации в структуре Django

  • www.website.com должен перенаправлять на дом.
  • www.website.com/profile/person должен перенаправить на профиль person.
  • www.website.com/profile/person/extra/useless/info должен перенаправить на профиль person, так как URL-адрес должен быть «обрезан» после profile/person/.
  • www.website.com/profile следует перенаправить обратно на www.website.com, который будет перенаправлен на главную.

Мой код до сих пор выглядит следующим образом.

# my_site/urls.py 

from django.conf.urls import include, url 
from django.contrib import admin 

urlpatterns = [ 
    url(r'^$', include('my_app.urls')), 
    url(r'^profile/', include('my_app.urls')), 
    url(r'^admin/', include(admin.site.urls)), 
] 

Часть 2:

# my_app/urls.py 

from django.conf.urls import url 
from django.http import HttpResponse 

from . import views 

urlpatterns = [ 
    url(r'^(?P<username>[\w-]*)/$', views.profile, name='profile'), 
    url(r'^(?P<username>[^\w-])/$', views.profile, name='profile'), # still link to the profile 
    url(r'^$', views.home, name="home"), 
] 

С помощью этого кода, когда пользователь вводит www.mysite.com/profile, пользователь является перенаправлены на главную страницу, но в адресной строке еще читает www.mysite.com/profile, что я не хотеть. Я хочу, чтобы он читал www.mysite.com. Кроме того, третье правило в списке правил, которое я дал выше, не соблюдается. Я думал о том, что у меня есть функция очистки URL-адресов, которая обрезает нежелательные части URL-адреса, но я понятия не имею, как это сделать. Любая помощь будет принята с благодарностью.

спасибо.

+0

Является ли "домашняя страница" так же, как страницы профиля? Я спрашиваю об этом, потому что вы указали все ваши url приложения на view.profile. Можете ли вы также опубликовать свои views.py? –

+0

Я ошибаюсь. Я хотел указать на «views.home». Виноват. – Joe

ответ

0

Чтобы изменить путь в браузере, вам необходимо использовать фактическое перенаправление http, а не просто резервное копирование URL-адреса Django.

# my_site/urls.py 

from django.conf.urls import include, url 
from django.contrib import admin 

urlpatterns = [ 
    url(r'^$', include('my_app.urls')), 
    url(r'^admin/', include(admin.site.urls)), 
] 


# my_app/urls.py 

from django.conf.urls import url 
from django.views.generic import RedirectView  

from . import views 

urlpatterns = [ 
    url(r'^profile/(?P<username>[^/]+)/$', views.profile, name='profile'), 
    url(r'^profile/(?P<username>[^/]+)/(.*)?', RedirectView.as_view(pattern_name='profile')), 
    url(r'^profile/$', RedirectView.as_view(pattern_name='home')), 
    url(r'^$', views.profile, name="home"), 
] 

объяснить:

  • ^profile/(?P<username>[^/]+)/$ матчей mysite.com/profile/my-user-name/ с не барахлом в конце
  • '^profile/(?P<username>[^/]+)/(.*)?' соответствует случаю с мусором в конце (после действительного имени пользователя и /) ... Вы хотите потребовать косой черты перед поиском нежелательной части, иначе если у вас есть два пользователя john и johnsmith, вы всегда будете соответствовать johnsmith в url как пользователь john (обработка smith как дополнительный барахт). Затем сделать реальный HTTP перенаправления к каноническому URL профиля
  • '^profile/$' матчи только mysite.com/profile/ и не реальный HTTP перенаправления на главную страницу

больше о перенаправлении Престола: https://stackoverflow.com/a/15706497/202168

также конечно Документах :
https://docs.djangoproject.com/en/1.8/ref/class-based-views/base/#redirectview
https://docs.djangoproject.com/en/1.8/topics/http/shortcuts/#redirect

Смежные вопросы