DjangoMTV学习1
Django简介
Django的MTV模式MTV分别代表:
Model(模型):数据存取层,实现数据持久化
Template(模版):表现层,负责如何把页面展示给用户
View(视图):业务逻辑层,调用Model和Template
Django还有一个url分发器,它的作用是将一个个URL的页面请求分发给不同的view处理,view再调用相应的Model和Template
Pytharm搭建Django项目
启动项目
1.由pycharm创建的直接单机运行按钮启动项目
2.由cmd创建,需要对该项目进行配置,如下
Django配置简介
"""
Django settings for Django project.
Generated by 'django-admin startproject' using Django 2.0.2.
For more information on this file, see
https://docs.djangoproject.com/en/2.0/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/2.0/ref/settings/
"""
import os
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
# 项目路径
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/2.0/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
# 秘钥配置
SECRET_KEY = 'k&czldpy&$_5t2s77s-a2u!%ok-=zc&p2&ld_66b1_k7(*!uik'
# SECURITY WARNING: don't run with debug turned on in production!
# 调试模式
DEBUG = True
# 域名访问权限
ALLOWED_HOSTS = ['*']
# Application definition
# app列表
INSTALLED_APPS = [
# 内置后台管理系统
'django.contrib.admin',
# 内置用户认证系统
'django.contrib.auth',
# 记录项目中所有model元数据(orm框架)
'django.contrib.contenttypes',
# Session会话功能
'django.contrib.sessions',
# 消息提示功能
'django.contrib.messages',
# 查找静态资源路径
'django.contrib.staticfiles',
]
MIDDLEWARE = [
# 内置安全机制
'django.middleware.security.SecurityMiddleware',
# 会员Session功能
'django.contrib.sessions.middleware.SessionMiddleware',
# 中间件支持中文
'django.middleware.locale.LocaleMiddleware',
# 处理请求信息,规范化请求内容
'django.middleware.common.CommonMiddleware',
# 开启CRSF防护功能
'django.middleware.csrf.CsrfViewMiddleware',
# 开启内置的用户认证系统
'django.contrib.auth.middleware.AuthenticationMiddleware',
# 开启内置的信息提示功能
'django.contrib.messages.middleware.MessageMiddleware',
# 防止恶意程序点击劫持
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'Django.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')]
,
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'Django.wsgi.application'
# Database
# https://docs.djangoproject.com/en/2.0/ref/settings/#databases
#数据库配置
"""
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
"""
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'django',
'USER': 'root',
'PASSWORD': 'root',
'HOST': '192.168.250.170',
'PORT': '3306',
},
}
# Password validation
# https://docs.djangoproject.com/en/2.0/ref/settings/#auth-password-validators
#用户密码验证器
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
# Internationalization
# https://docs.djangoproject.com/en/2.0/topics/i18n/
#配置时区,语言
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.0/howto/static-files/
# 静态文件目录
STATIC_URL = '/static/'
# 设置根目录的静态资源文件夹 设置App(index)的静态资源文件夹
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'public_static'), os.path.join(BASE_DIR, 'index/index_static')]
创建App:代表项目应用(网站的一个或多个网页)
app的创建由manage.py实现,python manage.py startapp XXX
完成index和user创建后,要配置app
使用mysql要下载mysqlclient : pip install mysqlclient
django不能创建数据库,所以要先创建好数据库。
根据model.py生成相关的.py文件,该文件用于创建数据库表
python manage.py makemigrations
创造或修改表结构
python manage.py migrate
可以在数据库看到新建的表
(顺便提一下,数据库数据迁移,可以使用主从复制)
手动添加数据
index app下views.py添加如下代码
from django.shortcuts import render
# Create your views here.
from .models import Product
# def index(request):
# return HttpResponse("hello word")
def index(request):
type_list = Product.objects.values('type').distinct()
name_list = Product.objects.values('name', 'type')
# 打印执行的sql
print(type_list.query)
print(name_list.query)
context = {'type_list': type_list, 'name_list': name_list}
return render(request, 'index.html', context=context, status=200)
templates新建index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<ul id="cate_box">
{% for type in type_list %}
<li>
<h3>{{ type.type }}</h3>
<p>
{% for name in name_list %}
{% if name.type == type.type %}
<span>{{ name.name }}</span>
{% endif %}
{% endfor %}
</p>
</li>
{% endfor %}
</ul>
</body>
</html>
index app下urls.py添加如下代码
from django.urls import path, re_path, include
from . import views
urlpatterns = [
# 配置简单URL
path('', views.index),
]
通用视图体验
Django封装常用代码,便于快速完成数据视图开发
封装的三个类
TemplateView:直接返回HTML模板,无法展示数据库数据。
ListView:能将数据库数据返回给HTML模板,通常获取批量数据。
DetailView:能将数据库数据返回给HTML模板,通常获取单条数据。
from django.shortcuts import render
# Create your views here.
from .models import Product
from django.http import HttpResponse
from django.views.generic import ListView
class ProductList(ListView):
content_object_name = "type_list"
template_name = "index.html"
# django.core.exceptions.ImproperlyConfigured: ProductList is missing a QuerySet. Define ProductList.model, ProductList.queryset, or override ProductList.get_queryset().
queryset = Product.objects.values('type').distinct()
# def get_queryset(self):
# return Product.objects.values('type').distinct()
def get_context_data(self, queryset=queryset, **kwargs):
context = super().get_context_data(**kwargs)
context['name_list'] = Product.objects.values('name', 'type')
context['type_list'] = queryset
return context
from . import views
from django.conf.urls import url
urlpatterns = [
# 通用视图
url(r'^index/$', views.ProductList.as_view()),
]