django-admin(day1)
1、admin学员信息查看
提供一个学员管理系统,有一个前台页面展示现有学员,并供新学员提交申请,一个后台负责处理。
django在渲染前端页面时,会根据settings.py中的APP的顺序查找templates,如果不同的app中含有相同的html文件,则会按顺序进行渲染
1 # models.py 2 3 from django.db import models 4 5 # Create your models here. 6 7 8 class Student(models.Model): 9 SEX_ITEMS = { 10 (1, '男'), 11 (2, '女'), 12 (0, '未知'), 13 } 14 15 STATUS_ITEMS = { 16 (0, '申请'), 17 (1, '通过'), 18 (2, '拒绝'), 19 } 20 21 name = models.CharField(max_length=128, verbose_name='姓名') 22 sex = models.IntegerField(choices=SEX_ITEMS, verbose_name='性别') 23 profession = models.CharField(max_length=128, verbose_name='职业') 24 email = models.EmailField(verbose_name='邮箱') 25 qq = models.CharField(max_length=128, verbose_name='QQ') 26 phone = models.CharField(max_length=128, verbose_name='电话') 27 28 status = models.IntegerField(choices=STATUS_ITEMS, default=0, verbose_name='审核状态') 29 30 create_time = models.DateTimeField(auto_now=True, editable=False, verbose_name='创建时间') 31 32 def __str__(self): 33 return '<Student: {}>'.format(self.name) 34 35 class Meta: 36 verbose_name = verbose_name_plural = '学员信息'
1 # admin.py 2 3 from django.contrib import admin 4 from .models import Student 5 6 # Register your models here. 7 8 class StudentAdmin(admin.ModelAdmin): 9 list_display = ('id', 'name', 'sex', 'profession', 'email', 'qq', 'phone', 'status', 'create_time') 10 list_filter = ('sex', 'status', 'create_time') 11 search_fields = ('name', 'profession') 12 13 fieldsets = ( 14 (None, { 15 'fields': ( 16 'name', 17 ('sex', 'profession'), 18 ('email', 'qq', 'phone'), 19 'status' 20 ) 21 }), 22 ) 23 24 25 admin.site.register(Student, StudentAdmin)
1 # views.py 2 3 from django.shortcuts import render 4 from .models import Student 5 6 # Create your views here. 7 8 9 def index(request): 10 students = Student.objects.all() 11 return render(request, 'index.html', {'students': students})
在admin,如果数据库表中的字段含有choice参数,Django会自动条用get_status_display方法,所以不用配置
在前端页面中,如果要调用含有choice参数的对象,则要调用get_Field_display方法
1 {# index.html #} 2 3 <!DOCTYPE html> 4 <html lang="en"> 5 <head> 6 <meta charset="UTF-8"> 7 <title>Title</title> 8 </head> 9 <body> 10 <h1>学院列表</h1> 11 {% for student in students %} 12 <li>{{ student.name }} - {{ student.get_status_display }}</li> 13 {% endfor %} 14 </body> 15 </html>
2、Form表单
1 from django import forms 2 from .models import Student 3 4 # class StudentForm(forms.Form): 5 # name = forms.CharField(label='姓名', max_length=128) 6 # sex = forms.ChoiceField(label='性别', choices=Student.SEX_ITEMS) 7 # profession = forms.CharField(label='职业', max_length=128) 8 # email = forms.EmailField(label='邮箱', max_length=128) 9 # qq = forms.CharField(label='QQ', max_length=128) 10 # phone = forms.CharField(label='手机', max_length=128) 11 12 13 class StudentForm(forms.ModelForm): 14 15 def clean_qq(self): 16 cleaned_data = self.cleaned_data['qq'] 17 if not cleaned_data.isdigit(): 18 raise forms.ValidationError('must be digits') 19 return int(cleaned_data) 20 21 class Meta: 22 model = Student 23 fields = ( 24 'name', 'sex', 'profession', 'email', 'qq', 'phone' 25 )
1 from django.shortcuts import render 2 from django.http import HttpResponseRedirect 3 from django.urls import reverse 4 from django.views import View 5 from .models import Student 6 from .forms import StudentForm 7 8 # Create your views here. 9 10 class IndexView(View): 11 12 template_name = 'index.html' 13 14 def get_content(self): 15 students = Student.get_all() 16 context = { 17 'student': students, 18 } 19 return context 20 21 def get(self,request): 22 context = self.get_content() 23 form = StudentForm() 24 context.update( 25 { 26 'form': form 27 } 28 ) 29 return render(request, self.template_name, context=context) 30 31 def post(self,request): 32 form = StudentForm(request.POST) 33 if form.is_valid(): 34 form.save() 35 return HttpResponseRedirect(reverse('index')) 36 37 context = self.get_content() 38 context.update( 39 { 40 'form': form 41 } 42 ) 43 return render(request, self.template_name, context=context)
1 from django.conf.urls import url 2 from django.contrib import admin 3 from student.views import IndexView 4 5 urlpatterns = [ 6 url(r'^admin/', admin.site.urls), 7 url(r'^$', IndexView.as_view(), name='index'), 8 ]
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 </head> 7 <body> 8 <h1>学院列表</h1> 9 {% for student in students %} 10 <li>{{ student.name }} - {{ student.get_status_display }}</li> 11 {% endfor %} 12 13 <form action="/" method="post"> 14 {% csrf_token %} 15 {{ form }} 16 <input type="submit" value="提交"> 17 </form> 18 </body> 19 </html>