Несколько авторизованных страниц входа в систему Django - PullRequest
0 голосов
/ 17 января 2020

У меня есть несколько приложений в одном django проекте

/user
/manager
/business`

Каждому требуется отдельный набор логина и регистрации. Как мне использовать django .contrib.auth для этого?

У меня есть urlpatterns в основном:

urlpatterns = [
    path('admin/',    admin.site.urls),
    path('user/',     include('user.urls')),
    path('user/',     include('django.contrib.auth.urls')),
    path('manager/',  include('manager.urls')),
    path('manager/',  include('django.contrib.auth.urls')),
    path('business/', include('business.urls')),
    path('business/', include('django.contrib.auth.urls')),

Urlpatterns в приложениях такие:

urlpatterns = [
    path('index', views.index, name='index'),
    path('register', views.register, name='register'),
]

и у меня есть разные представления для login и register, также в каждом приложении есть разные шаблоны: /templates/register/register.html и /templates/register/login.html

Однако представления для входа в систему и регистрации кажутся общими для всех Программы. Есть ли способ их легко разделить?

1 Ответ

0 голосов
/ 19 января 2020

Прежде всего, я бы посоветовал вам использовать пространства имен в ваших URL-адресах, чтобы не возникало конфликтов с именами в ваших URL-адресах. Так что добавьте app_name в urls.py ваших приложений, например,

#user urls.py

app_name='user'
urlpatterns = [
    ...

Тогда что-то вроде {% url 'user:register' %} будет указывать для регистрации представления вашего пользовательского приложения, {% url 'manager:register' %} будет указывать на представление реестра для ваше приложение менеджера и т. д.

Если вы определили отдельные представления входа в систему для каждого приложения, то же самое относится и к этим представлениям, при условии, что вы импортировали правильные представления в свои приложения urls.py.

Поскольку вы также включаете django .contrib.auth.urls в каждое из ваших приложений, конечно, есть второй путь 'login /', идущий от пути по умолчанию в auth.urls. Тем не менее, насколько я знаю, разрешение URL-адресов выполняется сверху вниз django, поэтому, если вы сохраните порядок URL-адресов, как в вашем сообщении, ваш пользовательский логин / имя будет первым и использован. Так что нет проблем с этим.

Где я вижу проблему с вашими шаблонами. Если я правильно понимаю, все они находятся в папке templates/register/ в ваших приложениях. Загрузчик шаблонов django не различает шаблон register.html в вашем пользовательском приложении и шаблон register.html в вашем приложении-менеджере. Так что, скорее всего, вы не получите правильный шаблон. Я бы предложил переместить шаблоны в подпапку с указанием c приложения, например, /templates/user/register. Затем вы можете получить правильные шаблоны в ваших представлениях (например, 'user / register. html').

Я понимаю, что у вас есть отдельные приложения, определяющие c просмотров. Конечно, вы всегда можете создать подклассы представлений django и адаптировать их к вашим потребностям. Например, переопределив метод form_valid() для LoginView. В этом посте SO приведен пример.

Если, с другой стороны, вы хотите использовать django представление входа по умолчанию только с пользовательским шаблоном, вы можете передать шаблон в качестве kwarg вашему Посмотреть. Например:

# user urls.py

from django.urls import path
from django.contrib.auth.views import LoginView

app_name='user'
urlpatterns = [
    path('login/', LoginView.as_view(template_name='user/login.html'), name='login'),
    # more patterns
]

Если вы хотите перенаправить на какой-либо пользовательский сайт после успешного входа в систему, вы можете добавить в форму входа вход «next», содержащий URL-адрес, куда перенаправлять, например,

<!-- user/login.html -->

<form action="{% url 'user:login' %}" method="POST">
    {% csrf_token %}
    {{ form }}
    <input type="hidden" name="next" value="/user/index/">
    <button type="submit">Login</button>
</form>

В ваших приложениях вы, вероятно, будете использовать декоратор user_passes_test или что-то подобное, чтобы проверить, разрешен ли пользователю доступ к представлению в этом приложении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...