D:\workspace>python -m venv student-env # 创建虚拟环境
D:\workspace>cd student-env # 进入虚拟环境目录
D:\workspace\student-env>Scripts\activate # 激活环境
(student-env) D:\workspace\student-env>Scripts\deactivate # 退出
D:\workspace\student-env>
pip install django~=1.11
mkdir student_house
cd student_house
django-admin startproject student_sys
python manage.py startapp student
定义模型层,封装数据获取的逻辑
from django.db import models
# Create your models here.
class Student(models.Model):
SEX_ITEMS = [
(1, '男'),
(2, '女'),
(0, '未知'),
]
STATUS_ITEM = (
(0, '申请'),
(1, '通过'),
(2, '拒绝'),
)
name = models.CharField(max_length=128, verbose_name='姓名')
sex = models.IntegerField(choices=SEX_ITEMS, verbose_name='性别')
profession = models.CharField(max_length=128, verbose_name='职业')
email = models.EmailField(verbose_name='Email')
qq = models.CharField(max_length=128, verbose_name='QQ')
phone = models.CharField(max_length=128, verbose_name='电话')
status = models.IntegerField(choices=STATUS_ITEM, default=0, verbose_name='审核状态')
# 自动添加日期时间,不可编辑
created_time = models.DateTimeField(auto_now_add=True, editable=False, verbose_name='创建时间')
def __str__(self):
return '' .format(self.name)
class Meta:
verbose_name = verbose_name_plural = '学员信息'
# 将数据获取的逻辑封装在Model层
@ classmethod
def get_all(cls):
return cls.objects.all()
注册管理后台
from django.contrib import admin
from student.models import Student
# Register your models here.
@admin.register(Student)
class StudentAdmin(admin.ModelAdmin):
# 列表页显示的字段
list_display = ('id', 'name', 'sex', 'profession', 'email', 'qq', 'phone', 'status', 'created_time')
# 列表页过滤器
list_filter = ('sex', 'status')
# 列表页查询字段
search_fields = ('name', 'profession')
# 编辑页字段,不与fields共存
fieldsets = (
('基本信息', {
'fields': ('name', 'sex', 'profession'),
}),
('联系方式', {
'fields': ('email', 'qq', 'phone')
})
)
定义form表单,可自定义数据校验规则
from django import forms
from student.models import Student
# 定义form表单
class StudentForm(forms.ModelForm):
class Meta:
model = Student
fields = (
'name', 'sex', 'profession',
'email', 'qq', 'phone',
)
# 自定义数据校验,方法名:clean_字段名
def clean_qq(self):
cleaned_data = self.cleaned_data['qq']
if not cleaned_data.isdigit():
# 错误信息会保存到form对象上,最终渲染到页面上
raise forms.ValidationError('必须是数字!')
return int(cleaned_data)
定义视图处理类class-base view
from django.http import HttpResponseRedirect
from django.shortcuts import render, redirect
from django.urls import reverse
from django.views import View
from student.forms import StudentForm
from student.models import Student
class IndexView(View):
template_name = 'index.html'
# 获取学员信息
def get_context(self):
students = Student.get_all() # 使用model中定义的类方法
context = {
'students': students,
}
return context
def get(self, request):
context = self.get_context()
form = StudentForm() # 创建form对象
context.update({
'form': form,
})
return render(request, self.template_name, context=context)
def post(self, request):
# 接受form表单提交的数据
form = StudentForm(request.POST)
if form.is_valid():
form.save()
# 重定向,使用reverse方法反向解析url地址,也可用redirect方法重定向
return HttpResponseRedirect(reverse('index'))
context = self.get_context()
# 走到这则证明form表单数据异常,此时form中会带上错误信息,如qq号格式错误,邮箱格式错误等
context.update({'form': form})
return render(request, self.template_name, context=context)
from django.conf.urls import url
from django.contrib import admin
from student.views import IndexView
urlpatterns = [
url(r'^$', IndexView.as_view(), name='index'),
url(r'^admin/', admin.site.urls),
]
<html lang="en">
<head>
<meta charset="UTF-8">
<title>学员管理系统title>
head>
<body>
<h1>学员管理系统h1>
<hr>
<ul>
{% for student in students %}
{# 直接显示status对应的文字#}
<li>{{ student.name }} - {{ student.get_status_display }}li>
{% endfor %}
ul>
<hr>
<form action="/" method="post">
{% csrf_token %}
{# 直接渲染自定的form表单#}
{{ form }}
<button>提交button>
form>
body>
html>