MVT综合应用
1.创建一个app, movies
语法: python manage.py startapp appname
python manage.py startapp movies
2.在settings.py 中配置app
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'goods'
'movies' # 配置movies app
]
3.创建模型类
from django.db import models
# Create your models here.
class MovieInfo(models.Model):
'''电影信息类
电影名
电影简介
上映状态:默认为已上映:True
'''
name = models.CharField(max_length=20)
introduction = models.TextField()
state = models.BooleanField(default=True)
#默认的str()方法是返回对象的数据类型,这里重写str()方法
def __str__(self):
return self.name
class RoleInfo(models.Model):
'''
演员信息表
姓名
性别,性别为字符型,默认是'女'
角色
电影类和角色类是一对多的关系,一个电影会出现多个角色
'''
name = models.CharField(max_length=20)
gender = models.CharField(default='女')
comment = models.TextField()
Mrole = models.ForeignKey('MovieInfo', on_delete=models.CASCADE)
def __str__(self):
return self.name
4. 数据迁移
python manage.py makemigrations
# Generated by Django 3.0.3 on 2020-03-01 03:43
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='MovieInfo',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=20)),
('introduction', models.TextField()),
('state', models.BooleanField(default=True)),
],
),
migrations.CreateModel(
name='RoleInfo',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=20)),
('gender', models.CharField(default='女', max_length=2)),
('comment', models.TextField()),
('Mrole', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='movies.MovieInfo')),
],
),
]
python manage.py migrate
5. 添加数据信息(略)
6. 设置管理员
配置本地化信息(略)
python manage.py createsuperuser
7. 设计后台管理页面
from django.contrib import admin
from movies.models import MovieInfo, RoleInfo
# 1.自定义后台管理类
class MovieInfoAdmin(admin.ModelAdmin):
'''管理电影信息'''
# 定义显示的列
list_display = ['id', 'name', 'state', 'introduction'] # 列名要和迁移文件中fields列表中的名称一致
class RoleInfoAdmin(admin.ModelAdmin):
'''管理演员信息'''
list_display = ['id', 'name', 'gender', 'comment', 'Mrole']
# Register your models here.
# 2.建立模型类和后台管理类的映射关系
admin.site.register(MovieInfo, MovieInfoAdmin)
admin.site.register(RoleInfo, RoleInfoAdmin)
python manage.py runserver
用户管理
电影管理
角色管理
8.配置项目路由
在movies下新建urls.py文件
在项目urls.py文件中添加app movies中的urls文件
from django.contrib import admin
from django.urls import path, re_path, include
urlpatterns = [
path('admin/', admin.site.urls), # 配置项目
re_path(r'^', include('goods.urls')), # 包含app goods中的urls文件
re_path(r'^', include('movies.urls')), # 包含app movies中的urls文件
]
9. 在template文件夹下新建一个movies包,然后创建模板文件
movies.html 用于显示电影列表
detail.html 用于显示每个电影的详细信息
10.创建视图函数
from django.shortcuts import render
from movies.models import MovieInfo, RoleInfo
# Create your views here.
#127.0.0.1:8000/movies
def show_movies(request):
# 1.获取电影信息
movies = MovieInfo.objects.all()
return render(request,'movies/movies.html', {'movies': movies})
# 127.0.0.1:8000/movies/id
def role_detail(request,mid):
movie = MovieInfo.objects.get(id=mid) # 获取对应id的电影信息
roles = movie.roleinfo_set.all() # 获取该电影对应的角色信息
return render(request, 'movies/detail.html', {'movies':movie, 'roles': roles})
11. 配置movies的路由
from django.conf.urls import url
from movies import views
urlpatterns = [
# 通过url函数设置url路由配置项
url(r'^movies$', views.show_movies), # 建立127.0.0.1:8000/movies和视图函数show_movies()之间的关系
url(r'^movies/(\d+)$', views.role_detail) # 建立127.0.0.1:8000/movies/id和视图函数role_detail()之间的关系
# 在正则表达式中定义组,可以将组里的内容作为参数传递给视图,即mid
# 注意这里只是匹配视图名称,不是调用视图函数
]
12.编写模板文件
detail.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>电影角色</title>
</head>
<body>
电影角色
{% for role in roles %}
<li>{{ role.name }}</li>
<ol>{{ role.gender }}</ol>
<ol>{{ role.comment }}</ol>
{% empty %}
<ol>没有更多信息了</ol>
{% endfor %}
</body>
</html>
movies.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>电影列表</title>
</head>
<body>
电影信息
{% for movie in movies%}
<li><a href = "/movies/{{ movie.id }}">{{movie.name}}</a></li>
<ol>{{ movie.introduction}}</ol>
{% endfor %}
</body>
</html>
13.运行
点击我和我的祖国
点击中国机长