Django建立一个音乐网站(四)

之前将网站一些该有的元素都准备完成了。接下来就是关于用户注册和后台admin设置。

user模块

关于一个网站的浏览量是靠用户的数量来决定的。所以每一个用户在网站的操作,要做出限制。这个是可以实现的。接着还有一些个人的账号和数据信息可以完善,让管理员能更好的管理。

#user的urls模块

from django.urls import path
from . import views

urlpatterns = [
    #用户的注册和登陆
    path('login.html', views.loginView, name='login'),
    #用户登录中心
    path('home/<int:page>.html', views.homeView, name='home'),
    #退出用户登陆
    path('logout.html', views.logoutView, name='logout'),
]

#两个html文件已经放到之前的文件下载中


------------------------------------------------------------------------------------------------
#user的models模块

from django.db import models
from django.contrib.auth.models import AbstractUser

class MyUser(AbstractUser):
    qq = models.CharField('QQ号码', max_length=20)
    weChat = models.CharField('微信账号', max_length=20)
    mobile = models.CharField('手机账号', max_length=11, unique=True)
    #设置返回值
    def __str__(self):
        return self.username

#这里与之前数据库的建立连接是一个意思,此时需要将之前库内所有表删除(建议先导出数据保存),在将这个执行
#python manage.py makemigrations和python manage.py migrate 两个指令操作

------------------------------------------------------------------------------------------------
#user的forms模块
from django.contrib.auth.forms import UserCreationForm
from .models import MyUser
from django import forms

#定义MyUser的数据表单,用于用户注册
class MyUserCreationForm(UserCreationForm):
    #重写初始化函数,设置自定义字段password1和password2的样式和属性
    def __init__(self, *args, **kwargs):
        super(MyUserCreationForm, self).__init__(*args, **kwargs)
        self.fields['password1'].widget = forms.PasswordInput(attrs={'class':'txt tabInput', 'placeholder':'密码,4-16位数字/字母。特殊符号(空格除外)'})
        self.fields['password2'].widget = forms.PasswordInput(attrs={'class':'txt tabInput', 'placeholder':'重复密码'})
    class Meta(UserCreationForm.Meta):
        model = MyUser
        #在注册界面添加模型字段:手机号码和密码
        fields = UserCreationForm.Meta.fields + ('mobile',)
        #设置模型字段的样式和属性(widgets)
        widgets = {
            'mobile':forms.widgets.TextInput(attrs={'class':'txt tabInput','placeholder':'手机号'}),
            'username':forms.widgets.TextInput(attrs={'class':'txt tabInput','placeholder':'用户名'}),
        }
        #实现用户的注册和登陆之前,除了自定义用户模型MyUser之外,还需要定义用户注册的表单类。
        #这里通过重写Django中的内置表单类UserCreationForm
        
        
------------------------------------------------------------------------------------------------
#user的views模块
from django.shortcuts import render, redirect
from django.db.models import Q
from index.models import Dynamic
from user.models import *
from django.contrib.auth import login, logout
from django.contrib.auth.hashers import check_password
from .form import MyUserCreationForm
from django.contrib.auth.decorators import login_required
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger

#用户注册与登录
def loginView(request):
    #表单对象user
    user = MyUserCreationForm()
    #表单提交
    if request.method == 'POST':
        #判断表单提交是     用户登陆     还是       用户注册
        #用户登陆
        if request.POST.get('loginUser', ''):#获取搜索内容如果为loginUser,没有返回空
            loginUser = request.POST.get('loginUser', '')#这里是已经获取到用户输入的
            password = request.POST.get('password', '')
            if MyUser.objects.filter(Q(mobile = loginUser) | Q(username=loginUser)):
                user = MyUser.objects.filter(Q(mobile=loginUser) | Q(username=loginUser)).first()#这里是sql语句在django中的不同表示方法
                if check_password(password, user.password):
                    login(request, user)
                    return redirect('/user/home/1.html')#页面跳转
                else:
                    tips = '密码错误'
            else:
                tips = '用户不存在'
        #用户注册
        else:
            user = MyUserCreationForm(request.POST)
            if user.is_valid():
                user.save()
                tips = '注册成功'
            else:
                if user.errors.get('username', ''):
                    tips = user.errors.get('username', '注册失败')
                else:
                    tips = user.errors.get('mobile', '注册失败')
    return render(request, 'login.html', locals())

#用户中心
#设置用户登录限制
@login_required(login_url='/user/login.html')
def homeView(request, page):
    #热搜歌曲
    search_song = Dynamic.objects.select_related('song').order_by('-dynamic_search').all()[:4]
    #分页功能
    song_info = request.session.get('play_list', [])
    paginator = Paginator(song_info, 3)
    try:#错误解决方法
        contacts = paginator.page(page)
    except PageNotAnInteger:
        contacts = paginator.page(1)
    except EmptyPage:
        contacts = paginator.page(paginator.num_pages)
    return render(request, 'home.html', locals())


def logoutView(request):
    logout(request)
    return redirect('/')

在上面的代码中涉及到了表单类这么一个概念。

在这里要说明以下,表单是搜集用户数据信息的各种表单元素的集合,作用是实现网页上的数据交互,用户在网站输入数据信息,然后提交到网站服务器端进行处理

表单我们学过html的知道,定义一个类似下拉菜单的样式,在这个项目中是先利用了内置表单类,然后重写了两个新功能。

1、添加用户注册的字段,在Meta类对fields属性设置字段即可,添加的字段必须是模型字段并且以元组或列表的形式添加

2、设置字段的CSS格式,设置表单字段mobile、username、password1、password2的attrs属性。其中mobile和username是模型MyUser的字段,所以在Meta类中重写widgets属性。widgets是内置表单类的一个参数,两个密码password是额外定义的表单字段,所以重写初始函数__init__可以实现字段样式设置

这里对表单说的有点多,因为在网站中,用户注册是一个非常重要的环节。而且表单这里还是涉及到了前端的知识…原谅本小白不才…实在能力有限。

至此除了后台系统之外,基本全部完成。上几个截图看看吧

Django建立一个音乐网站(四)
Django建立一个音乐网站(四)
Django建立一个音乐网站(四)
Django建立一个音乐网站(四)
接下来就是后台系统了…