创建工程
django-admin createproject Cources
切到工程目录下,创建项目
python manage.py startapp course
python manage.py startapp account
项目文件
setting.py中添加app名
INSTALLED_APPS=[
……
'course',
'account'
]
一级路由urls.py中配置
from django.conf.urls import url,include
from django.contrib import admin
# 通用视图中的模板视图,可快速返回模板
from django.views.generic import TemplateView
urlpatterns = [
url(r'^admin/', admin.site.urls),
# url() 第二个参数只能是函数
url(r'^test/',TemplateView.as_view(template_name='login.html')),
url(r'^course/',include('course.urls',namespace='course')),
url(r'^account/',include('account.urls',namespace='account')),
]
app名:course
models.py文件
# 先引入django内置的模块和User类
from django.db import models
from django.contrib.auth.models import User
#course类,主体科目类
class Course(models.Model):
# 科目所属者,讲师
user = models.ForeignKey(User,related_name=course_user"
#科目名字
title = models.CharField(max_length=100)
#科目描述,字段为文本类型
description = models.TextField()
# 科目创建时间,自动添加当前时间
created_at = models.DateTimeField(auto_now_add=True)
# 科目应用者,学员选课
student = models.ManyToManyField(User,related_name='joined_user')
#载入内置方法,对象直接显示名字
def __str__(self):
return self.title
class Lesson(models.Model):
#课程创造者
user = models.ForeignKey(User,related_name='lesson_user')
#章节名
title = models.CharField(max_length=100)
# 所属课程
course = models.ForeignKey(Course,related_name='lession_course'
#视频
video=models.FileField(upload_to='videos'
#详细描述
description = models.TextField(blank=True)
#创建时间
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.title
views.py文件
from django.shortcuts import render
from django.views.generic import ListView,TemplateView
from course.models import Course,Lession
from django.views import View
from django.shortcuts import get_object_or_404
from braces.views import LoginRequiredMixin
#总科目的通用类视图
class CourseListView(ListView):
model = Course
# 内容
context_object_name = 'courses'
# 模板
template_name = "course/course_list.html"
# 用类视图,因为需要接受参数,从url中
class LessionsListView(TemplateView,View):
template_name = 'course/lession_list.html'
def get(self,request,course_id):
# 获取course_id对应的课,第一个参数是模型名,第二个是id
course = get_object_or_404(Course,id=course_id)
return self.render_to_response({'course':course})
#管理员创建课程Course,需要登录验证
class UserMixin:
# Mixin:混合类
# 这个类要和别的类混合在一起使用,在命名类的时候,在结尾加上Mixin
def get_queryset(self):
querysets = super(UserMixin,self).get_queryset()
return querysets.filter(user=self.request.user)
class UserCourseMixin(UserMixin,LoginRequiredMixin) :
#设定当前类从哪个模型读取数据
model = Course
#设定如果没有登陆,重定向的登陆地址是什么?
login_url = '/account/login/'
# 多继承,减少耦合
class MangeCourseListView(UserCourseMixin,ListView):
# 通过UserCourseMixin类为当前类添加登陆限制,即只有登陆才能访问当前类视图MangeCourseListView
context_object_name = 'courses'
template_name = 'course/manage/course_list.html'
新建二级路由urls.py文件
from django.conf.urls import url
from course.views import CourseListView,LessionsListView,MangeCourseListView
urlpatterns = [
url(r'^list/',CourseListView.as_view(),name='course_list'),
url(r'^(?P<course_id>[0-9]+)/',LessionsListView.as_view(),name='course_detail'),
# 管理课程列表 url(r'^manage/',MangeCourseListView.as_view(),name='manage_course'),
]
admin.py文件
from django.contrib import admin
from course.models import Course,Lession
# Register your models here.
# 将模型加到管理中
admin.site.register(Course)
admin.site.register(Lession)
app名:account
models.py文件
from django.db import models
from django.contrib.auth.models import User
class UserProfile(models.Model):
# 用户,出生日期,手机号
user = models.OneToOneField(User,unique=True)
# 生日可以为为空
birth = models.DateField(null=True,blank=True)
# 手机号,可以为空,用字符串形式,方便排序查找
phone = models.CharField(max_length=100,null=True)
def __str__(self):
return self.user.username
class UserInfo(models.Model):
# 用户详细信息
user = models.OneToOneField(User,unique=True)
# 学校
school = models.CharField(max_length=100,blank=True)
# 公司
company = models.CharField(max_length=100,blank=True)
# 专业
profession = models.CharField(max_length=100,blank=True)
# 详细地址
address = models.CharField(max_length=200,blank=True)
# 个人介绍
description = models.TextField(blank=True)
# 个人图像
photo = models.ImageField(blank=True,upload_to='images')
def __str__(self):
return self.user.username
新建forms.py文件
from django import forms
from django.contrib.auth.models import User
from account.models import UserInfo,UserProfile
# 几个model创建几个form
class UserProfileForm(forms.ModelForm):
# 基与Model创建Form
class Meta:
# 指定基于哪个Model
model = UserProfile
fields = ('phone','birth')
class UserInfoForm(forms.ModelForm):
class Meta:
model = UserInfo
fields = ('user','school','company','profession','address','description','photo')
class UserForm(forms.ModelForm):
class Meta:
model = User
fields = ('email',)
# 新建一个注册表单
class RegisterForm(forms.ModelForm):
#widget 对应inout中的type
password1 = forms.CharField(label='密码',widget=forms.PasswordInput)
password2 = forms.CharField(label='确认密码',widget=forms.PasswordInput)
class Meta:
model = User
fields = ('username','email')
view.py文件
from django.shortcuts import render,redirect,reverse
from django.http import HttpResponse
# django内置的用户登录验证
from django.contrib.auth import authenticate,login,logout
from django.contrib.auth.models import User
from account.models import UserProfile,UserInfo
def user_login(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
#登录验证
user = authenticate(username=username,password=password)
# 如果验证通过,把user保存到request请求会话中
if user:
login(request,user)
return HttpResponse('登录成功')
else:
return HttpResponse('登录失败')
if request.method == 'GET':
#返回登录页面
return render(request,'account/login.html')
def register(request):
if request.method == 'POST':
# 一次性获取到全部数据
data = request.POST
# 取出需要的数据
username = data.get('username')
password1 = data.get('password1')
password2 = data.get('password2')
birth = data.get('birth')
email = data.get('email')
phone = data.get('phone')
# 可扩展不为空判断
# 使用form完成注册
user = User(username=username,password=password1)
#使用form完成注册
if request.method == 'POST':
from account.forms import RegisterForm
from account.forms import UserProfileForm,UserInfoForm
user_form = RegisterForm(request.POST)
user_profile_form = UserProfileForm(request.POST)
# 提取user_form但没提交
new_user = user_form.save(commit=False)
# 从user_form中提取password1
new_user.set_password(user_form.cleaned_data['password1'])
# 保存user
new_user.save()
new_user_profile = user_profile_form.save(commit=False)
# 关联user_profile和user
new_user_profile.user = new_user
# 保存 user_profile
new_user_profile.save()
# user中信息已存在,直接关联即可
UserInfo.objects.create(user=new_user)
# 注意,用了命名空间,不能直接重定向到某个函数
# return redirect(user_login)
# 反转到路径
return redirect(reverse("account:user_login"))
if request.method == 'GET':
# 把注册表单发送给用户
return render(request,'account/register.html')
新建二级路由urls.py文件
from django.conf.urls import url
from account.views import user_login,register
urlpatterns = [
url(r'^login/',user_login,name='user_login'),
url(r'^register/',register,name='user_register')
]
admin.py文件
from django.contrib import admin
from account.models import UserProfile
# Register your models here.
# 自定义模型显示的内容
class UserProfileAdmin(admin.ModelAdmin):
# 指定显示的字段
list_display = ('user','phone')
# 指定过滤字段
list_filter = ('phone',)
# 原本的写法,只显示原本的用户名
# admin.site.register(UserProfile)
# 自定义的直接会显示两个字段,有过滤条件
admin.site.register(UserProfile,UserProfileAdmin)
小结:
项目功能:
管理员:管理科目与课程;可扩展(增删改查)
用户注册,登陆,选科目,选课程;可扩展(用户注册登录的判断)