DjangoMTV学习1

本文介绍了Django的MTV模式,详细讲解了如何使用PyCharm搭建Django项目,包括项目的启动、配置和创建App。在Django配置部分,提到了创建App的步骤,并说明了如何使用mysqlclient与MySQL数据库进行集成。接着,文章展示了如何通过makemigrations和migrate命令创建和修改数据库表。最后,文章探讨了Django的通用视图,如TemplateView、ListView和DetailView,它们简化了视图的开发过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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模板,通常获取单条数据。

view.py

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

urls.py

from . import views
from django.conf.urls import url

urlpatterns = [
 # 通用视图
 url(r'^index/$', views.ProductList.as_view()),
]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值