개인 블로그 구축을 위한 Python + Django4(15): 등록 기능 페이지 구현

이전 글에서는 사용자 로그인과 로그아웃을 구현했습니다.

이 글에서는 사용자 관리의 또 다른 중요한 기능인 등록을 개선합니다.

등록 양식 작성 수업

사용자가 등록할 때 계좌번호, 비밀번호 등과 같은 데이터를 제출하는 양식이 사용되므로 등록 양식을 작성해야 합니다 /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를 작성하는 이러한 방식은 자동으로 호출하여 단일 필드의 데이터를 확인하고 정리합니다.passworddef clean_password2()def clean_[字段]

필드를 재정의한 후에는 class Meta내부 클래스의 정의가 이 필드에 영향을 미치지 않으므로 필드를 포함할 필요가 없습니다 password.

주의가 필요합니다:

비밀번호 일관성을 검증하는 방법은 작성할 수 없습니다 . 방법을 def clean_password()정의하지 않으면 그 안에 있는 데이터가 유효하지 않은 데이터로 판단되어 정리되어 속성이 존재하지 않게 되기 때문입니다. 결국 두 개의 비밀번호 입력은 항상 일치하지 않게 되어 오류의 원인을 파악하기 어려워집니다.def clean_password2()password2Djangopassword2

거기서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' ),
]

시험

서버를 실행하고 로그인 페이지에 들어가면 등록 프롬프트가 나타납니다:

계정 등록을 클릭하여 등록 페이지로 들어갑니다.

양식을 작성한 후 제출하세요. (이메일 주소는 비워둘 수 있습니다.)

성공적으로 로그인하고 블로그 목록으로 돌아오면 기능이 완료됩니다.

요약하다

이 장에서는 양식 클래스, 데이터 확인 및 정리, 기타 지식을 사용하여 사용자 등록 기능을 완료합니다.

이제 핵심 사용자 로그인, 로그아웃, 등록 기능을 기본적으로 구현했습니다.

다음으로 우리는 또 다른 중요한 모듈인 댓글 관리를 배울 것입니다.

рекомендация

отblog.csdn.net/agelee/article/details/126966234
рекомендация