이전 글에서는 사용자 로그인과 로그아웃을 구현했습니다.
이 글에서는 사용자 관리의 또 다른 중요한 기능인 등록을 개선합니다.
등록 양식 작성 수업
사용자가 등록할 때 계좌번호, 비밀번호 등과 같은 데이터를 제출하는 양식이 사용되므로 등록 양식을 작성해야 합니다 /userprofile/forms.py
.
# 注册用户表单
class UserRegisterForm(forms.ModelForm):
# 复写 User 的密码
password = forms.CharField()
password2 = forms.CharField()
class Meta:
model = User
fields = ('username', 'email')
# 对两次输入的密码是否一致进行检查
def clean_password2(self):
data = self.cleaned_data
if data.get('password') == data.get('password2'):
return data.get('password')
else:
raise forms.ValidationError("密码输入不一致,请重试。")
이전 장에서 언급했듯이 데이터베이스를 운영하는 폼은 모델에 이미 있는 필드를 자동으로 생성할 수 있는 Forms.ModelForm을 상속해야 합니다.
여기서는 사용자가 비밀번호를 잘못 입력하지 않았는지 확인하기 위해 password
일반적으로 등록 중에 필드를 다시 입력해야 하기 때문에 필드를 덮어썼으므로 데이터를 직접 확인할 수 있도록 덮어씁니다. 비밀번호가 일치하는지 확인하는 내용입니다. Django를 작성하는 이러한 방식은 자동으로 호출하여 단일 필드의 데이터를 확인하고 정리합니다.password
def clean_password2()
def clean_[字段]
필드를 재정의한 후에는 class Meta
내부 클래스의 정의가 이 필드에 영향을 미치지 않으므로 필드를 포함할 필요가 없습니다 password
.
주의가 필요합니다:
비밀번호 일관성을 검증하는 방법은 작성할 수 없습니다 . 방법을 def clean_password()
정의하지 않으면 그 안에 있는 데이터가 유효하지 않은 데이터로 판단되어 정리되어 속성이 존재하지 않게 되기 때문입니다. 결국 두 개의 비밀번호 입력은 항상 일치하지 않게 되어 오류의 원인을 파악하기 어려워집니다.def clean_password2()
password2
Django
password2
거기서POST
얻은 값은 data.get('password')
안전하게 쓰여져 있어서, 사용자가 비밀번호를 입력하지 않아도 프로그램 에러나 점프아웃 현상이 발생하지 않습니다. 이전 장에서 POST 데이터를 추출하는 데 사용했는데 data['password']
, 이 값 메서드가 data
포함되지 않으면 password
오류 Django
가 보고됩니다. 사용자가 비밀번호를 입력하지 않고 제출하는 것을 방지하는 또 다른 방법은 required
나중에 설명할 양식에 속성을 삽입하는 것입니다.
보기 기능
등록된 뷰를 작성합니다 /userprofile/views.py
.
# 用户注册
def user_register(request):
if request.method == 'POST':
user_register_form = UserRegisterForm(data=request.POST)
if user_register_form.is_valid():
new_user = user_register_form.save(commit=False)
# 设置密码
new_user.set_password(user_register_form.cleaned_data['password'])
new_user.save()
# 保存好数据后立即登录并返回博客列表页面
login(request, new_user)
return redirect("list")
else:
return HttpResponse("注册表单输入有误。请重新输入~")
elif request.method == 'GET':
user_register_form = UserRegisterForm()
context = { 'form': user_register_form }
return render(request, 'userprofile/register.html', context)
else:
return HttpResponse("请使用GET或POST请求数据")
게시된 기사 보기 와 사용자 로그인 보기를 논리적으로 결합하며 , 새로운 지식은 없습니다.
등록이 성공적으로 완료되면 사용자는 자동으로 로그인되어 블로그 목록 페이지로 돌아갑니다.
템플릿 및 URL
우리는 또한 양식과 관련된 템플릿 파일에 대해 잘 알고 있으며 여기에는 두 가지 템플릿 작성 및 처리가 포함됩니다.
1. 등록 페이지 추가
새로운templates/userprofile/register.html
{% extends "base.html" %} {% load static %}
{% block title %} 注册 {% endblock title %}
{% block content %}
<div class="container">
<div class="row justify-content-md-center">
<div class="col-md-6">
<br>
<form method="post" action=".">
{% csrf_token %}
<!-- 账号 -->
<div class="form-group">
<label for="username">昵称</label>
<input type="text" class="form-control" id="username" name="username" required>
</div>
<!-- 邮箱 -->
<div class="form-group">
<label for="email">Email</label>
<input type="text" class="form-control" id="email" name="email">
</div>
<!-- 密码 -->
<div class="form-group">
<label for="password">设置密码</label>
<input type="password" class="form-control" id="password" name="password" required>
</div>
<!-- 确认密码 -->
<div class="form-group">
<label for="password2">确认密码</label>
<input type="password" class="form-control" id="password2" name="password2" required>
</div>
<br>
<!-- 提交按钮 -->
<button type="submit" class="btn btn-primary btn-block">提交</button>
</form>
</div>
</div>
</div>
{% endblock content %}
위의 템플릿 파일에서는 앞에서 언급한 속성을 닉네임 및 비밀번호 태그에 input
추가했습니다 . required
사용자가 속성이 있는 필드를 채우지 않으면 required
양식을 제출할 수 없으며 사용자에게 양식을 작성하라는 메시지가 표시됩니다. 실제로 앞서 학습한 많은 양식에는 required
속성을 추가하여 데이터의 유효성을 미리 확인할 수 있습니다.
2. 등록 입구 추가
로그인 페이지에 등록 항목을 추가합니다 /templates/userprofile/login.html
.
<div class="form-group">
<br>
<h5>还没有账号?</h5>
<h5>点击<a href='{% url "register" %}'>注册账号</a>加入我们吧!</h5>
<br>
</div>
마지막 단계는 라우팅 파일을 구성하는 것입니다 django4blog/urls.py
.
urlpatterns = [
path('admin/', admin.site.urls),
path('hello/', article.views.hello),
re_path(r'^$', article.views.article_list),
path('list/', article.views.article_list, name='list'), # 展示文章
path('detail/<int:id>/', article.views.article_detail, name='detail'), # 文章详情
path('create/', article.views.article_create, name='create'), # 写文章
path('delete/<int:id>/', article.views.article_delete, name='delete'),# 删除文章
path('update/<int:id>/', article.views.article_update, name='update'), # 更新文章
path('login/', userprofile.views.user_login, name='login' ),
path('logout/', userprofile.views.user_logout, name='logout' ),
# 增加注册管理
path('register/', userprofile.views.user_register, name='register' ),
]
시험
서버를 실행하고 로그인 페이지에 들어가면 등록 프롬프트가 나타납니다:
계정 등록을 클릭하여 등록 페이지로 들어갑니다.
양식을 작성한 후 제출하세요. (이메일 주소는 비워둘 수 있습니다.)
성공적으로 로그인하고 블로그 목록으로 돌아오면 기능이 완료됩니다.
요약하다
이 장에서는 양식 클래스, 데이터 확인 및 정리, 기타 지식을 사용하여 사용자 등록 기능을 완료합니다.
이제 핵심 사용자 로그인, 로그아웃, 등록 기능을 기본적으로 구현했습니다.
다음으로 우리는 또 다른 중요한 모듈인 댓글 관리를 배울 것입니다.