Django가 간단한 블로그 시스템을 만들기(6)---사용자 등록 로그인

69754 단어
전언
앞의 몇 편의 블로그는 문장의 기본적인 첨삭과 수정을 완성하였다.
  • Django가 간단한 블로그 시스템을 만들기(1)----준비 작업
  • Django가 간단한 블로그 시스템을 만들기(2)---템플릿 덮어쓰기
  • Django가 간단한 블로그 시스템을 만들기(3)----기사 상세
  • Django가 간단한 블로그 시스템을 만들기(4)----Markdown 문법으로 글을 쓴다
  • Django가 간단한 블로그 시스템을 만들었다(5)--문장의 증가, 삭제, 수정
  • 다음은 다음 하위 퀘스트 -------유저 로그인 및 등록 감사 신의 강좌:Django 개인 블로그 구축.
    하나.준비 작업
    대부분의 사이트에 대해 말하자면, 사용자 데이터는 비교적 중요한 데이터라고 할 수 있다.한편, 사용자 관리는 사용자 데이터에 대한 삭제와 수정이며 자연히 매우 중요하다.우리는 먼저 사용자 로그인부터 시작합니다.사용자 관리와 글 관리의 기능이 같지 않기 때문에 우리는 사용자 관리를 위한 앱을 하나 더 만들었습니다.
    python manager.py startapp userprofile
    

    그리고 이 앱을 설정해 놓으세요.
    둘.사용자 로그인
    1. 폼 클래스 처리
    userprofile 아래forms를 만듭니다.py 파일:
    from django import forms
    from django.contrib.auth.models import User
    
    #     
    #     Form   ModelForm                  
    class UserLoginForm(forms.Form):
        username = forms.CharField()
        password = forms.CharField()
    

    2. 뷰 함수 작성
    userprofile/views.py:
    from django.shortcuts import render,HttpResponse,redirect
    from django.contrib.auth import authenticate,login,logout
    from django.http import HttpResponse
    from userprofile.forms import UserLoginForm,UserRegisterForm
    from django.contrib.auth.models import User
    from django.contrib.auth.decorators import login_required
    
    def user_login(request):
        if request.method == 'POST':
            user_login_form = UserLoginForm(data=request.POST)
            if user_login_form.is_valid():
                # .cleaned_data        
                data = user_login_form.cleaned_data
                #     、                 
                #            user   
                user = authenticate(username=data['username'], password=data['password'])
                if user:
                    #          session  ,        
                    login(request, user)
                    return redirect("article:article_list")
                else:
                    return HttpResponse("         。     ~")
            else:
                return HttpResponse("          ")
        elif request.method == 'GET':
            user_login_form = UserLoginForm()
            context = { 'form': user_login_form }
            return render(request, 'userprofile/login.html', context)
        else:
            return HttpResponse("   GET POST    ")
    

    여기에서:
  • 사용자 로그인은 글을 발표하는 폼 종류와 유사합니다.Form 객체의 임무는 데이터를 검증하고 is 를 호출하는 것입니다.valid () 방법 검증;
  • user_login_form.cleaned_데이터는 사용자가 제출한 데이터에서 합법적인 데이터를 제거하는 것이다.
  • authenticate () 방법은 사용자 이름과 비밀번호가 일치하는지 확인하고, 만약 그렇다면 이 사용자 데이터를 되돌려줍니다.
  • login(request,user)은 사용자 로그인을 실현하고 사용자 데이터를session에 저장하면 우리는session을 다시 쓸 필요가 없다.

  • 3. 로그인 템플릿 작성
    /templates/userprofile/login.html:
    % extends "base.html" %} {% load staticfiles %}
    {% block title %}    {% endblock title %}
    {% block content %}
    <div class="container">
        <div class="row">
            <div class="col-12">
                <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">
                    div>
                    
                    <div class="form-group">
                        <label for="password">  label>
                        <input type="password" class="form-control" id="password" name="password">
                    div>
                    
                    <button type="submit" class="btn btn-primary">  button>
                form>
            div>
        div>
    div>
    {% endblock content %}
    

    tempalates/header를 수정합니다.html, 로그인 버튼 추가:
    <ul class="navbar-nav">
        ...
    
        <li class="nav-item">
            <a class="nav-link" href="{% url 'article:article_list' %}">  a>
        li>
    
        
        {% if user.is_authenticated %}
            
            <li class="nav-item dropdown">
                <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                  {{ user.username }}
                a>
                <div class="dropdown-menu" aria-labelledby="navbarDropdown">
                  <a class="dropdown-item" href="#">    a>
                div>
            li>
        
        {% else %}
            <li class="nav-item">
                <a class="nav-link" href="{% url 'userprofile:login' %}">  a>
            li>                    
        
        {% endif %}
    ul>
    

    4. URL 구성
    Personal_Blog/urls.py:
    path('userprofile/', include('userprofile.url',namespace='userprofile')),
    

    userprofile/url.py:
    path('login/',views.user_login,name='login'),
    

    그리고 프로그램을 실행하면 됩니다.
    셋.사용자 로그아웃
    사용자가 로그인하면 사용자가 로그아웃하는 것이 간단합니다.
    1. 보기 함수 작성
    userprofile/views.py
    #   logout  
    from django.contrib.auth import authenticate, login, logout
    
    ...
    #     
    def user_logout(request):
        logout(request)
        return redirect("article:article_list")
    

    2. URL 설정
    userprofile/url.py:
    path('logout/',views.user_logout,name='logout'),
    

    3. 헤더 수정
    header.html:
    #    href       
    <a class="dropdown-item" href='{% url "userprofile:logout" %}'>    a>
    

    그리고 프로그램을 실행하면 됩니다.
    넷.사용자 등록
    1. 레지스트리 클래스
    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:
                return forms.ValidationError("         ")
    

    2. 뷰 함수 작성
    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("article:article_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    ")
    

    3. 템플릿 작성
    userprofile/register.html
    {% extends "base.html" %} {% load staticfiles %}
    {% block title %}    {% endblock title %}
    {% block content %}
    <div class="container">
        <div class="row">
            <div class="col-12">
                <br>
                <form method="post" action=".">
                    {% csrf_token %}
                    
                    <div class="form-group col-md-4">
                        <label for="username">  label>
                        <input type="text" class="form-control" id="username" name="username" required>
                    div>
                    
                    <div class="form-group col-md-4">
                        <label for="email">Emaillabel>
                        <input type="text" class="form-control" id="email" name="email">
                    div>
                    
                    <div class="form-group col-md-4">
                        <label for="password">    label>
                        <input type="password" class="form-control" id="password" name="password" required>
                    div>
                    
                    <div class="form-group col-md-4">
                        <label for="password2">    label>
                        <input type="password" class="form-control" id="password2" name="password2" required>
                    div>
                    
                    <button type="submit" class="btn btn-primary">  button>
                form>
            div>
        div>
    div>
    {% endblock content %}
    

    로그인 페이지에 추가:uerprofile/login.html:
    <div class="col-12">
        <br>
        <h5>h5>
        <h5>  <a href='{% url "userprofile:register" %}'>    a>h5>
        <br>
        <form method="post" action=".">
            ...
        form>
    div>
    
    

    4. URL 구성
    userprofile/url.py:
    path('register/',views.user_register,name='register'),
    

    그리고 프로젝트를 실행하면 됩니다.
    오.사용자 삭제
    사용자의 로그인과 등록에 비해 사용자의 삭제는 더욱 신중해야 한다.
    1. 보기 함수 작성
    userprofile/views.py:
    # @login_required   python   .
    #                    ,           .
    #     ,  @login_required    user_delete()   ,      
    #            ,       '/userprofile/login/'   
    #             ,    user_delete(),
    #          id          ,
    #  if              
    #                ,        
    
    @login_required(login_url='/userprofile/login/')
    def user_delete(request,id):
        if request.method == "POST":
            user = User.objects.get(id=id)
            #       ,         
            if request.user == user:
                #     ,           
                logout(request)
                user.delete()
                return redirect("article:article_list")
            else:
                return HttpResponse('          ')
        else:
            return HttpResponse("   post  ")
    

    2. 템플릿 작성
    헤더를 덮어쓰다.html:
    
    <nav class="navbar navbar-expand-lg navbar-dark bg-dark">
      <div class="container">
    
        
        <a class="navbar-brand" href="#">    a>
    
        
        <div>
          <ul class="navbar-nav">
            
            <li class="nav-item">
            <a class="nav-link" href="{% url 'article:article_create' %}">   a>
            li>
            <li class="nav-item">
              <a class="nav-link" href="{% url 'article:article_list' %}">  a>
            li>
    
            {% if user.is_authenticated %}
            
            <li class="nav-item dropdown">
                <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                  {{ user.username }}
                a>
                <div class="dropdown-menu" aria-labelledby="navbarDropdown">
                  <a class="dropdown-item" href="#" onclick="user_delete()">    a>
                  <a class="dropdown-item" href="{% url 'userprofile:logout' %}">    a>
                div>
            li>
        
        {% else %}
            <li class="nav-item">
                <a class="nav-link" href="{% url 'userprofile:login' %}">  a>
            li>
        
        {% endif %}
          ul>
        div>
    
      div>
    nav>
    
    
    {% if user.is_authenticated %}
    <form
        style="display:none;"
        id="user_delete"
        action="{% url 'userprofile:delete' user.id %}"
        method="POST"
    >
    {% csrf_token %}
        <button type="submit">  button>
    form>
        <script>
            function user_delete() {
                //   layer    
                layer.open({
                    title: "    ",
                    content: "         ?",
                    yes: function(index, layero) {
                        $('form#user_delete button').click();
                        layer.close(index);
                    },
                })
            }
        script>
    {% endif %}
    
    

    3. URL 구성
    userprofile/url.py:
    path('delete/',views.user_delete,name='delete'),
    

    그리고 프로젝트를 실행하면 돼요.
    맨 마지막에 쓰다
    본고는 개인의 학습 노트입니다. 만약에 권리 침해가 있으면 제때에 연락하여 삭제해 주십시오. 감사합니다.

    좋은 웹페이지 즐겨찾기