在线教育网站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'))
三、 使用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类中的字段名一致。



浙公网安备 33010602011771号