认识Django

  1. Python下有许多款不同的 Web 框架。Django是重量级选手中最有代表性的一位。许多成功的网站和APP都基于Django。
  2. Django是一个开放源代码的Web应用框架,由Python写成。
  3. Django采用了MVC的软件设计模式,即模型M,视图V和控制器C

1. 创建隔离的python环境

  pip install virtualenv #安装virtualenv my_env#创建目录which python3  #找到python3目录virtualenv my_env -p /Library/Frameworks/Python.framework/Versions/3.7/bin/python3 #将python3作为解释器source my_env/bin/activate  #激活,开始使用deactivate 退出

2. 安装Django

pip install Django==2.0.5

3. 创建项目

Django-admin startproject mysite
mysite/项目结构:
manage.py
mysite/
  init.py
 
 setting.py
 
 url.py
 
 _wsgi.py
python manage.py migrate #通过数据库迁移,初始状态下的应用程序表将在数据库中被创建。
创建完成后,根目录里应该多了个db.sqlite3

4. 运行开发服务器

python manage.py runserver- 认识项目设置setting.pyDEBUG在生产环境下应该置为False.- 项目和应用程序“项目”我理解为所有应用程序基于某些设置项的安装结果。“应用程序”(即app,也就是下文中的blog)是模型+试图+模板+url 的组合应用程序与框架进行交互,提供特定的功能。

5. 创建应用程序

继续在虚拟环境里执行 python manage.py startapp blog
此时多了个blog/目录 和下面文件如下:
admin.py 可在该文件中注册模型
app.py 包含了blog这个应用程序主要配置内容(之后在激活app时候用到)
migrations包含了应用程序(app)的数据库迁移。迁移可以使Django跟踪模块变化内容,并相应的同步数据库。
model.py 包含了应用程序的数据模型,但是也可以被置空。
test.py 用来测试的
views.py包含逻辑内容

6. 数据模型

每个模型是一个python类,为django.db.models.Model的子类,每个属性视为数据库的一个字段。

  • 创建model.py文件中的数据表(即各python类)
from django.db import models
from django.utils import timezone
from  django.contrib.auth.models import User
# Create your models here.class Post(models.Model):STATUS_CHOICE=(('draft','Draft'),('published','Published'))title=models.CharField(max_length=250)slug=models.SlugField(max_length=250,unique_for_date='publish')author=models.ForeignKey(User,on_delete=models.CASCADE,related_name='blog_posts',default="")body=models.TextField(default="")publish=models.DateTimeField(default=timezone.now)created=models.DateTimeField(auto_now_add=True)#auto_now_add=True:实例在第一次保存的时候自动保存当前时间,不能手动修改(但相对于auto_now,auto_now_add下次是可以的)。status=models.CharField(max_length=10,choices=STATUS_CHOICE,default='draft')class Meta:ordering=('-publish',)def __str__(self):return self.title

其中ForeignKey 的用法,待总结。。

  • 为了使Django跟踪应用程序并针对模型创建数据表,我们需要激活:
       编辑setting.py文件,像INSTALLED_APPS设置中加入app.py中所用到的类BlogConfig。格式为’blog.apps.BlogConfig’(若使用pycharm等IDE可能会给自动创建,可省略此步)

  • 迁移两步走
    创建了数据模型,我们最终需要的是定义数据库表,所以我们需要迁移:
    1)python manage.py makemigrations blog #让 Django 知道我们在我们的模型有一些变更,此时生成了0001_initial.py文件

        python manage.py sqlmigrate blog 0001 #命令可以查看某次迁移的SQL语句。
    

2) python manage.py migrate #将数据库与模型最终同步。

7. 站点管理

  • 登录

什么是站点?
对应的是之前说的admin.py应用。只要启动项目后,打开/admin/路径即可。
但是前提是需要创建超级用户(不然也登不进去呀)
python manage.py createsuperuser

  • 向站点添加模型

重点来啦~~~ 怎么把模型添加到站点,以后方便我们维护呢?
编辑admin.py文件

from django.contrib import admin
from .models import Post.
admin.site.register(Post)  # 注册模型

之后打开站点就可以看到我们的模型啦,打开后就可以进行维护啦

8. 定制模型的显示方式

待整理

9. QuerySet和管理器

  • 创建对象

    方法一:两步走

     post=Post(title="tile",slug="sss",body="post body",suthor=user)#未插入到数据库post.save()#真正执行Insert操作

方法二:一步到位
创建对象,并将其持久化至数据库中

Post.objects.create(title="tile",slug="sss",body="post body",suthor=user)

  • 更新对象
    post.title="new title"
    post.save()
    
  • 获取对象

Django默认管理器objects。通过该管理器得到一个QuerySet对象,常用的方法有
Post.objects.all()
Post.objects.get(username=‘admin’)
Post.objects.filter(publish__year=2017)
Post.objects.exclude(publish__year=2017)#排除
Post.objects.order_by(‘title’)默认升序,降序改为’-title’

其他方法可参考官网:https://docs.djangoproject.com/en/2.0/ref/models

  • 删除对象

post=Post.objects.get(username=‘admin’)
post.delete()

10. 创建视图

from django.shortcuts import render,get_object_or_404
#get_object_or_404 若结果不存在则抛出404异常from .models import Postdef blog_list(request):post_result=Post.objects.all()return  render(request,'post/list.html',{'post_value':post_result})#这里返回的字段中的Key即post_value用于在模板中引用
def blog_detail(request,year,month,day,slug):post_result=get_object_or_404(Post,slug=slug,publish__year=year,publish__month=month,publish__day=day)return  render(request,'post/detail.html',{'post_value':post_result})

11. URL

这里分为两部分(当然也可以直接在项目url中一步到位,但是在有多个APP的情况下结构清晰,推荐两步):
第一步:创建应用程序的url :
blog/urls.py:

from django.urls import path
from . import  viewsapp_name='blog'  #本url的命名空间,被引用时使用urlpatterns=[path('',views.blog_list,name='list_name'),path('<int:year>/<int:month>/<int:day>/<slug:slug>/',views.blog_detail,name='detail_name')
#路径中变量由上一级传参,动态
]

项目urls.py:

from django.contrib import admin
from django.urls import path,includeurlpatterns = [path('admin/', admin.site.urls),path('post/',include('blog.urls',namespace='blog'))#引用用应用程序,使用命名空间
]

为了获取url路径需要使用reverse方法,在models.py中添加此函数:

    def get_absolute_url(self):return reverse('blog:detail_name',args=[self.publish.year,self.publish.month,self.publish.day ,self.slug])

12. 创建模板文件

一个基文件base.html和两个继承文件,目录:
base.html
post/
   list.html
   detail.html
base.html:

{% load static %}  # 加载静态文件
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>{% block title %}{% endblock %}</title><link href="{% static "css/blog.css" %}" rel="stylesheet">
</head>
<body>
<div id="content">{% block content %}{% endblock %}
</div>
<div id="sidebar"><h2>My base blog</h2><p>this is my base blog;</p>
</div>
</body>
</html>

list.html:

{% extends "base.html" %}  #继承
{% block title %}My Blog{% endblock %}
{% block content %}
<h1>MY BLOG FOR LIST</h1>{% for p in post_value %}<h2><a href="{{ p.get_absolute_url}}">  #使用此方法获取url{{ p.title}}</a></h2><p class="date">Published{{ p.publish }}by {{ p.author }}</p>{{ p.body|truncatewords:30|linebreaks }}{% endfor %}
{% endblock %}

detail.html:

{% extends "base.html" %}
{% block title %}{{post.title}}{% endblock %}
{% block content %}<h1>{{post_value.title}}</h1><p id ="date">published {{ post_value.publish}}by{{ post_value.author }}</p>{{ post_value.body|linebreaks }}
{% endblock %}

【问题汇总】:

  • [1 ] File "manage.py", line 14 ) from exc ^ SyntaxError: invalid syntax

解决:使用virtualenv来做环境,更改pycharm中设置的编译器地址。

  • [ 2] You are trying to add a non-nullable field 'author' to post without a default; we can't do that (the database needs something to populate existing rows)
    解决:在每个报错字段的后面加一个default=""即可

  • [ 3]blog.Post.created: (fields.E160) The options auto_now, auto_now_add, and default are mutually exclusive. Only one of these options may be present
    经过:因为后面追加上默认值default=timezone.now,提示auto_now_add=Ture与其不能共存,在网上一时也没找到更加合适的办法
    解决:第一次就只加默认值,指定两步迁移到数据库表;之后去掉default再次修改为auto_now_add=Ture,迁移成功。其中:
    DateTimeField、DateField和TimeField三种类型可以用来创建日期字段,其值分别对应着datetime()、date()、time()三中对象。这三个field有着相同的参数auto_now和auto_now_add,

Django项目实例精讲相关推荐

  1. Django模板变量精讲

    Django模板变量精讲 我们知道,模板是文本文件,比如我们常见的有 HTML.CSV.TXT 等.Django 模板语言的语法主要分为以下四个部分: 变量 标签 过滤器 注释 下面章节我们会对这四部 ...

  2. python flask高级编程之restful_('Python Flask高级编程之RESTFul API前后端分离精讲',),全套视频教程学习资料通过百度云网盘下载...

    资源详情 r n t某课网好评度100%的Python Flask高级编程之RESTFul API前后端分离精讲 r n t t t第1章 随便聊聊 r n t t t聊聊Flask与Django,聊 ...

  3. 学习python-day02-25---转自Python分布式爬虫打造搜索引擎Scrapy精讲

    第三百六十九节,Python分布式爬虫打造搜索引擎Scrapy精讲-elasticsearch(搜索引擎)用Django实现搜索功能 Django实现搜索功能 1.在Django配置搜索结果页的路由映 ...

  4. 视频教程-Python入门精讲视频,从入门到精通-Python

    Python入门精讲视频,从入门到精通 10年Linux使用及管理经验,7年IT在线教育培训经验.拥有RHCA高级架构师及Openstack证书.精通Linux.Python.思科.C++.安全渗透等 ...

  5. 学习python-day02-24---转自Python分布式爬虫打造搜索引擎Scrapy精讲

    第三百六十八节,Python分布式爬虫打造搜索引擎Scrapy精讲-用Django实现搜索的自动补全功能 elasticsearch(搜索引擎)提供了自动补全接口 官方说明:https://www.e ...

  6. win32com操作word API精讲项目实战 预告

    对win32com的使用和研究有好一段时间了,想起本人刚开始做word编程项目时的各种痛苦:网上能找到的都是简单的示例,如同hello word一般,嚼之无味又无可奈何.读office的word接口文 ...

  7. 【C++自我精讲】基础系列二 const

    [C++自我精讲]基础系列二 const 0 前言 分三部分:const用法.const和#define比较.const作用. 1 const用法 const常量:const可以用来定义常量,不可改变 ...

  8. 第三百三十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—深度优先与广度优先原理...

    第三百三十八节,Python分布式爬虫打造搜索引擎Scrapy精讲-深度优先与广度优先原理 网站树形结构 深度优先 是从左到右深度进行爬取的,以深度为准则从左到右的执行(递归方式实现)Scrapy默认 ...

  9. 【牛客每日一题】tokitsukaze and Soldier 题目精讲 贪心、优先队列、堆

    链接:https://ac.nowcoder.com/acm/problem/50439 来源:牛客网 ACM在线模板 今天才发现牛客推出了一个每日一题的版块,3月25号就开始了,今天才发现,赶紧补救 ...

最新文章

  1. Android 金钱计算BigDecimal 的使用
  2. Lambda表达式【转】
  3. 安卓在线按钮设计网站
  4. c语言程序加仿真,求助。C语言的程序和仿真
  5. 极度舒适的 Python 入门教程,佩奇也能学会~
  6. 信息学奥赛一本通(1160:倒序数)
  7. gateway动态路由_Java如何用Spring Cloud奇淫小技巧 来使用gateway作为服务网管
  8. SQL Server 2000中的完整备份、差异备份操作
  9. node.js 之 socket.io
  10. Acoustica Premium Edition Mac(音频编辑软件)
  11. python调用库roc_curve()_解决ROC曲线画出来只有一个点的问题
  12. 高仿小米盒子UI桌面
  13. C++ string类常用方法
  14. Android 图片压缩也即生成缩略图方法
  15. Rest-assured使用
  16. 换计算机硬盘分区,笔记本提速,换硬盘,分区,系统迁移,装机!
  17. [na]office 2010 2013卸载工具
  18. Openid Connect(OIDC)
  19. sysconfig看不了怎么更新_sysconfig老版本下载-sysconfig稳定版(能看的版本)_5577安卓网...
  20. 【已解决-靠谱】windows server 2019安装net3.5方法

热门文章

  1. 如何看待无人驾驶技术产生的伦理道德问题
  2. 已解决note: This is an issue with the package mentioned above,not pip.
  3. DELMIA学习笔记(三)人体建模学习笔记
  4. opencv之dilate()函数
  5. hp2548无线服务器地址,无线直连可以这么玩_HP 2548_办公打印应用指南-中关村在线...
  6. 华为HYBRID的配置
  7. keil stm32f407工程环境搭建
  8. oppoa83t怎么升级android8,OPPO A83t刷机教程_OPPO A83t卡刷升级更新官方系统包
  9. 台式计算机屏幕扩展,浅谈修图电脑配置(台式/显示器篇)
  10. 新中关大厦污水泵站远程监控系统解决方案