在线教育网站2

一、扩展Django的user表,采用继承的方式

1.新建一个class并继承AbstractUser

from django.contrib.auth.models import AbstractUser

class UserProfile(AbstractUser):
    nick_name = models.CharField(max_length=32, verbose_name='昵称', default='')
    birthday = models.DateField(verbose_name='生日', null=True, blank=True)
    gender = models.CharField(max_length=6, choices=(('male', '男'), ('female', '女')), default='male')
    address = models.CharField(max_length=100, default="")
    mobile = models.CharField(max_length=11, null=True, blank=True)
    image = models.ImageField(upload_to='image/%Y/%m/%d', default='image/default.png', max_length=100)

    class Meta:
        verbose_name = '用户信息'  # 给模型类起个名字,即表名
        verbose_name_plural = verbose_name  # 这个选项是指定,模型的复数形式是什么,如果不指定Django会自动在模型名称后加一个’s’

    def __unicode__(self):
        return self.username

2.修改setting.py文件中的AUTH_USER_MODEL设置覆盖默认的用户

AUTH_USER_MODEL = ‘users.UserProfile’ # 注册过的app名称.用户模型类的名称

3.datetime.now后面不要加括号

如果不去掉括号的话会根据模型类编译的时间生成时间,不加括号在模型类实例化的时候生成时间

二、将所有的app移动到apps下

1.新建apps目录将所有的app移动到此目录下,右击apps,选择Mark Directory as—>Sources Root.

2.在settings.py文件中进行如下设置。

import sys
sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))
settings

 三、 使用xadmin替换admin

1.注册app修改settings.py

INSTALLED_APPS = [  

    'xadmin',
    'crispy_forms',
    'reversion',
]

2.修改urls.py:

import xadmin

urlpatterns = [
    url(r'^xadmin/', xadmin.site.urls),
]

3.注册model,在每个app下新建一个adminx.py文件。

// 以课程(course)app下的adminx.py文件示范

import xadmin
from .models import Course, Lesson, Video, CourseResource

xadmin.site.register(Course)
xadmin.site.register(Lesson)
xadmin.site.register(Video)
xadmin.site.register(CourseResource)

四、自定义xadmin(类似于admin)

users/adminx.py:

1.自定义显示字段:
list_display=[]

2.自定义搜索字段:
search_field=[]

3.自定义过滤器:
list_filter=[]

class EmailVerifyRecordAdmin(object):
list_display = ['code', 'email', 'send_type', 'send_time']
search_fields = ['code', 'email', 'send_type']
list_filter = ['code', 'email', 'send_type', 'send_time']

五、 使用xadmin主题样式

1.设置xadmin的中文显示。修改settings.py:

LANGUAGE_CODE = 'zh-hans'  

TIME_ZONE = 'Asia/Shanghai'

2..xadmin的样式设置:

users/adminx.py:

from xadmin import views

class BaseSetting(object):
enable_themes = True # 使用主题功能
use_bootswatch = True

xadmin.site.register(views.BaseAdminView, BaseSetting) # 注册

from xadmin import

class GlobalSettings(object):
site_title = '智课后台管理系统'
site_footer = '杭州智课在线教育有限公司'
menu_style = 'accordion' # 设置菜单样式 

xadmin.site.register(views.BaseAdminView, BaseSetting)

中文显示app名称:修改每个app下的apps.py文件。
apps.py:

class CoursesConfig(AppConfig):
name = 'courses'
verbose_name = '课程管理'

Python2.7中还要修改每个app下的__init__.py
__init__.py:
default_app_config = app名称.apps.CoursesConfig(settings中注册app的方法)

 

六、页面渲染
直接渲染静态页面:(不需要视图函数),在urls.py中使用类视图的时候都是调用它的 .as_view()函数,.as_view()会返回一个函数的句柄

urls.py:

from django.views.generic import TemplateView
            
urlpatterns = [
    url(r'^$', TemplateView.as_view(template_name='index.html'), name='index'),
]

七、登录认证:

1.登录认证:

users/views.py:

from django.contrib.auth import authenticate, login

        def m_login(request):
            if request.method == 'POST':
                username = request.POST.get('username', '')
                password = request.POST.get('password', '')
                user = authenticate(username=username, password=password)

                if user:
                    login(request, user)
                    return render(request, 'index.html')
                else:
                    return render(request, 'login.html', {'msg': '用户名或密码错误'})

            elif request.method == 'GET':
                return render(request, 'login.html')

2.自定义authentication,实现邮箱名登录:

settings.py

AUTHENTICATION_BACKENDS = (
    'users.views.CustomBackend', # 使用users/views.py 中的CustomBackend类
)

users/views.py: 

from django.contrib.auth.backends import ModelBackend
from .models import UserProfile
from django.db.models import Q


class CustomBackend(ModelBackend):
    def authenticate(self, request, username=None, password=None, **kwargs):
        try:
            user = UserProfile.objects.get(Q(username=username) | Q(email=username))
            if user.check_password(password):
                return user
        except Exception as e:
            return None


3.基于类实现登录认证:

users/views.py:

from django.views.generic.base import View


class LoginView(View):
    def get(self, request):  # View会自动判断请求方法(request.method),并调用对应的方法。
        return render(request, 'login.html')

    def post(self, request):  # View会自动判断请求方法(request.method),并调用对应的方法。
        username = request.POST.get('username', '')
        password = request.POST.get('password', '')
        user = authenticate(username=username, password=password)

        if user:
            login(request, user)
            return render(request, 'index.html')
        else:
            return render(request, 'login.html', {'msg': '用户名或密码错误'})

urls.py:

from users.views import LoginView

urlpatterns = [
    url(r'^login/$', LoginView.as_view(), name='login'),
]

 

4.使用Form验证

在用户(users)app下新建form.py

user/form.py:

from django import forms


class LoginForm(forms.Form):
    username = forms.CharField(required=True)
    password = forms.CharField(required=True, min_length=6)

users/views.py:

class LoginView(View):
    def get(self, request):
        return render(request, 'login.html',)

    def post(self, request):
        login_form = LoginForm(request.POST)
        if login_form.is_valid():
            username = request.POST.get('username', '')
            password = request.POST.get('password', '')
            user = authenticate(username=username, password=password)

            if user:
                if user.is_active:
                    login(request, user)
                    return redirect('/index/')
                else:
                    return render(request, 'login.html', {'msg': '用户未激活'})
            else:
                return render(request, 'login.html', {'login_form': login_form, 'msg': '用户名或密码错误'})
        else:
            return render(request, 'login.html', {'login_form': login_form})

 

使用form可以验证字段是否合法,也可以子在用户名或密码错误时进行数据的回填。使用login_form.username.value

<input name="username" id="account_l" type="text" value="{{ login_form.username.value }}" placeholder="手机号/邮箱" />
<input name="password" id="password_l" type="password" value="{{ login_form.password.value }}" placeholder="请输入您的密码" />

需要注意的一点是我们在前端使用的是原生input标签,在使用Form验证是一定要保证input标签的name属性和LoginForm类中的字段名一致。

 

 

posted @ 2018-03-04 16:54  流星之泪  阅读(130)  评论(0)    收藏  举报