现在我们有了有效的自定义用户模型,我们可以添加每个网站需要的功能:注册、登录和注销用户的能力。 Django 提供了我们登录和注销所需的一切,但我们需要创建自己的表单来注册新用户。我们还将构建基本主页,其中包含指向所有三个功能的链接,因此我们不必每次都手动输入 URL。
模板
$ mkdir -p templates/registration
config/settings.py
# config/settings.py
TEMPLATES = [
{
...
'DIRS': [str(BASE_DIR.joinpath('templates'))],
...
}
]
...
LOGIN_REDIRECT_URL = 'home' # new
LOGOUT_REDIRECT_URL = 'home' # new
templates/base.html
<!-- templates/base.html -->
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>{% block title %}Newspaper App{% endblock title %}</title>
</head>
<body>
<main>
{% block content %}
{% endblock content %}
</main>
</body>
</html>
templates/home.html
<!-- templates/home.html -->
{% extends 'base.html' %}
{% block title %}Home{% endblock title %}
{% block content %}
{% if user.is_authenticated %}
Hi {{ user.username }}!
<p><a href="{% url 'logout' %}">Log Out</a></p>
{% else %}
<p>You are not logged in</p>
<a href="{% url 'login' %}">Log In</a> |
<a href="{% url 'signup' %}">Sign Up</a>
{% endif %}
{% endblock content %}
templates/registration/login.html
<!-- templates/registration/login.html -->
{% extends 'base.html' %}
{% block title %}Log In{% endblock title %}
{% block content %}
<h2>Log In</h2>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Log In</button>
</form>
{% endblock content %}
templates/registration/signup.html
<!-- templates/registration/signup.html -->
{% extends 'base.html' %}
{% block title %}Sign Up{% endblock title %}
{% block content %}
<h2>Sign Up</h2>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Sign Up</button>
</form>
{% endblock content %}
URL
config/urls.py
# config/urls.py
from django.contrib import admin
from django.urls import path, include # new
from django.views.generic.base import TemplateView # new
urlpatterns = [
path('admin/', admin.site.urls),
path('accounts/', include('accounts.urls')), # new
path('accounts/', include('django.contrib.auth.urls')), # new
path('', TemplateView.as_view(template_name='home.html'),
name='home'), # new
]
accounts/urls.py
# accounts/urls.py
from django.urls import path
from .views import SignUpView
urlpatterns = [
path('signup/', SignUpView.as_view(), name='signup'),
]
accounts/views.py
# accounts/views.py
from django.urls import reverse_lazy
from django.views.generic import CreateView
from .forms import CustomUserCreationForm
class SignUpView(CreateView):
form_class = CustomUserCreationForm
success_url = reverse_lazy('login')
template_name = 'registration/signup.html'
管理页面
accounts/forms.py
# accounts/forms.py
from django import forms
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
from .models import CustomUser
class CustomUserCreationForm(UserCreationForm):
class Meta(UserCreationForm):
model = CustomUser
fields = ('username', 'email', 'age',) # new
class CustomUserChangeForm(UserChangeForm):
class Meta:
model = CustomUser
fields = ('username', 'email', 'age',) # new
注册用户testuser后登录
访问http://127.0.0.1:8000/admin会提示没有权限。
结论
到目前为止,我们的 Newspaper 应用程序有一个自定义用户模型和工作注册、登录和注销页面。但是您可能已经注意到我们的网站看起来不太好。在下一章中,我们将为样式添加 Bootstrap 并创建专用的页面应用程序。
网友评论