Django项目实例一

创建工程

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)

 

小结:

项目功能:

管理员:管理科目与课程;可扩展(增删改查)

用户注册,登陆,选科目,选课程;可扩展(用户注册登录的判断)

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值