使用django自定义模板标签


使用Django Form实现的功能包含一下几个图:
image.png
image.png
image.png
image.png
知识拓展:
image.png
image.png
将blog_detail.html中的form标签粘贴到公共的templates/login.html中,

{% extends 'base.html' %}
{% load static %}


{% block title %}
    我的网站|登录
{% endblock %}


{% block nav_home_active %}active{% endblock %}


{% block content %}
    <div class="containter">
        <div class="row">
            <div class="col-xs-4 col-xs-offset-4">
                <div class="panel panel-default">
                    <div class="panel-heading">
                        <h3 class="panel-title">登录</h3>
                    </div>
                    <div class="panel-body">
                        <form action="" method="POST">
                            {% csrf_token %}
                            {% for field in login_form %}
                                <label for="{{ field.id_for_label }}">{{ field.label }}</label>
                                {{ field }}
                                <p class="text-danger">{{ field.errors.as_text }}</p>
                            {% endfor %}
                            <span class="pull-left text-danger">{{ login_form.non_field_errors }}</span>
                            <input type="submit" value="登录" class="btn btn-primary pull-right">
                        </form>
                    </div>
                </div>                
            </div>
        </div>
    </div>    
{% endblock %}

重写mysite/views.py中的login函数(反向解析获取首页链接)

from .forms import LoginForm, RegForm
...
def login(request):
    if request.method == 'POST':
        login_form = LoginForm(request.POST)
        if login_form.is_valid():
            user = login_form.cleaned_data['user']
            auth.login(request, user)
            return redirect(request.GET.get('from', reverse('home')))
    else:
        login_form = LoginForm()


    context = {}
    context['login_form'] = login_form
    return render(request, 'login.html', context)

在blog_detail.html中的登录前面加:您尚未登陆...

您尚未登录,登录之后方可评论~
<a class="btn btn-primary" href="{% url 'login' %}?from={{ request.get_full_path }}">登录</a>
<span> or </span>
<a class="btn btn-danger" href="{% url 'register' %}?from={{ request.get_full_path }}">注册</a>

然后使用Django Form:

在mysite中创建forms.py文件,然后创建loginForm函数

from django import forms
from django.contrib import auth
from django.contrib.auth.models import User


class LoginForm(forms.Form):
    username = forms.CharField(label='用户名',
                               widget=forms.TextInput(attrs={'class':'form-control', 'placeholder':'请输入用户名'}))
    password = forms.CharField(label='密码',
                               widget=forms.PasswordInput(attrs={'class':'form-control', 'placeholder':'请输入密码'}))


    def clean(self):
        username = self.cleaned_data['username']
        password = self.cleaned_data['password']


        user = auth.authenticate(username=username, password=password)
        if user is None:
            raise forms.ValidationError('用户名或密码不正确')
        else:
            self.cleaned_data['user'] = user
        return self.cleaned_data

然后增加注册功能:
在forms.py中增加RegForm的类:

# forms.py
class RegForm(forms.Form):
    """
    用户注册功能实现
    """
    username = forms.CharField(label='用户名',
                               max_length=30,
                               min_length=3,
                               widget=forms.TextInput(attrs={'class':'form-control', 'placeholder':'请输入3-30位用户名'}))
    email = forms.EmailField(label='邮箱',
                             widget=forms.EmailInput(attrs={'class':'form-control', 'placeholder':'请输入邮箱'}))
    password = forms.CharField(label='密码',
                               min_length=6,
                               widget=forms.PasswordInput(attrs={'class':'form-control', 'placeholder':'请输入密码'}))
    password_again = forms.CharField(label='再输入一次密码',
                                     min_length=6,
                                     widget=forms.PasswordInput(attrs={'class':'form-control', 'placeholder':'再输入一次密码'}))


    def clean_username(self):
        """
        针对用户名进行验证
        """
        username = self.cleaned_data['username']
        if User.objects.filter(username=username).exists():
            raise forms.ValidationError('用户名已存在')
        return username


    def clean_email(self):
        """
        针对用户邮箱进行验证
        """
        email = self.cleaned_data['email']
        if User.objects.filter(email=email).exists():
            raise forms.ValidationError('邮箱已存在')
        return email


    def clean_password_again(self):
        """
        验证再次输入的密码是否和上面第一次输入的密码一致
        """
        password = self.cleaned_data['password']
        password_again = self.cleaned_data['password_again']
        if password != password_again:
            raise forms.ValidationError('两次输入的密码不一致')
        return password_again

在mysite/views.py中增加对注册功能的处理函数,和login函数基本一样

from .forms import LoginForm, RegForm
from django.contrib.auth.models import User
...
def register(request):
    """
    注册功能的视图处理函数
    """
    if request.method == 'POST':
        reg_form = RegForm(request.POST)
        if reg_form.is_valid():
            """
            因为前端需要这些参数,所以这里先从后端提取,然后返回给前端
            """
            username = reg_form.cleaned_data['username']
            email = reg_form.cleaned_data['email']
            password = reg_form.cleaned_data['password']
            # 创建用户
            user = User.objects.create_user(username, email, password)
            user.save()
            # 登录用户
            user = auth.authenticate(username=username, password=password)
            auth.login(request, user)
            return redirect(request.GET.get('from', reverse('home')))
    else:
        reg_form = RegForm()


    context = {}
    context['reg_form'] = reg_form
    return render(request, 'register.html', context)

在总的mysite/urls.py中增加register的路由匹配

path('register/', views.register, name='register'),

在公共的templates中新建register.html,内容和login.html一样,区别就是登录改成注册,然后增加几个标签即可:

{% extends 'base.html' %}
{% load static %}


{% block title %}
    我的网站|注册
{% endblock %}


{% block nav_home_active %}active{% endblock %}


{% block content %}
    <div class="containter">
        <div class="row">
            <div class="col-xs-4 col-xs-offset-4">
                <div class="panel panel-default">
                    <div class="panel-heading">
                        <h3 class="panel-title">注册</h3>
                    </div>
                    <div class="panel-body">
                        <form action="" method="POST">
                            {% csrf_token %}
                            {% for field in reg_form %}
                                <label for="{{ field.id_for_label }}">{{ field.label }}</label>
                                {{ field }}
                                <p class="text-danger">{{ field.errors.as_text }}</p>
                            {% endfor %}
                            <span class="pull-left text-danger">{{ reg_form.non_field_errors }}</span>
                            <input type="submit" value="注册" class="btn btn-primary pull-right">
                        </form>
                    </div>
                </div>                
            </div>
        </div>
    </div>    
{% endblock %}

成果展示:
image.png
image.png
image.png


笨小孩
20 声望3 粉丝

你,要怎样度过这一生?有的人二十岁已经死了,有的人七十岁还在发现生命的可能,有人终其一生,不知道自己要的是什么;有人简单执拗,终其一生;忠于自我未必有结果,坚持努力也不一定换来成功,但有天,回望过...