跟着老齐学django笔记
建立项目
django-admin startproject mysite
django-admin startapp blog
建立项目后,根据习惯做一些设置
建立三个文件夹 apps ,statics,tempaltes用来存放自己的应用和模板以及静态文件,目录结构如下
也是打算好好认真读一下这本书,顺便做些笔记,也看下官方的案例,打打基础,目录结构如下
mysite
├── apps
│ ├── blog
│ │ ├── admin.py
│ │ ├── apps.py
│ │ ├── __init__.py
│ │ ├── migrations
│ │ │ ├── 0001_initial.py
│ │ │ ├── __init__.py
│ │ │ └── __pycache__
│ │ │ ├── 0001_initial.cpython-39.pyc
│ │ │ └── __init__.cpython-39.pyc
│ │ ├── models.py
│ │ ├── __pycache__
│ │ │ ├── admin.cpython-39.pyc
│ │ │ ├── __init__.cpython-39.pyc
│ │ │ └── models.cpython-39.pyc
│ │ ├── tests.py
│ │ └── views.py
│ └── polls
│ ├── admin.py
│ ├── apps.py
│ ├── __init__.py
│ ├── migrations
│ │ └── __init__.py
│ ├── models.py
│ ├── tests.py
│ └── views.py
├── asgi.py
├── db.sqlite3
├── __init__.py
├── __pycache__
│ ├── __init__.cpython-39.pyc
│ ├── settings.cpython-39.pyc
│ └── urls.cpython-39.pyc
├── settings
│ ├── dev.py
│ └── __pycache__
│ └── dev.cpython-39.pyc
├── statics
├── templates
├── urls.py
└── wsgi.py
然后来说下settings里的配置,这里吧settings给放到一个目录下面了,源文件改名为dev.py,为了区分开发模式和产品模式
来说下settings里的一些配置
import os,sys
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
PROJECT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# 追加导包路径
sys.path.insert(0, os.path.join(PROJECT_DIR, 'apps'))
这里修改了BASE_DIR,因为移动了settings的目录,然后追加了PROJECT_DIR项目目录,和apps的导入目录
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
#自己的app
'blog',
]
注册自己的app,可以手动吧刚才的blog移动到apps的目录下,也可以自己进入到那个目录下进行创建
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = False
这里配置下语言和时区
接下来配置下静态文件的目录
STATICFILES_DIRS = [
os.path.join(PROJECT_DIR, 'statics'),
]
STATIC_ROOT = os.path.join(PROJECT_DIR, 'collect_static')
STATIC_URL = '/statics/'
MEDIA_ROOT = os.path.join(PROJECT_DIR, 'media')
MEDIA_URL = '/img/'
有强迫症吧,每次都是这样该配置,不想目录看起来太乱。接下来就可以跟着书本练习了
进入blog的models.py文件 建立blog的数据模型
from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
# Create your models here.
class BlogArticles(models.Model):
title = models.CharField(max_length=300)
author = models.ForeignKey(User,related_name='blog_post',on_delete=models.PROTECT)
body = models.TextField()
publish = models.DateTimeField(default=timezone.now)
class Meta:
ordering = ("-publish",)
db_table = 'yf_BogArticles'
def __str__(self):
return self.title
然后 根据步骤 迁徙数据库
在python中方法名如果是__xxxx__()的,那么就有特殊的功能,因此叫做“魔法”方法
当使用print输出对象的时候,只要自己定义了__str__(self)方法,那么就会打印从在这个方法中return的数据
__str__方法需要返回一个字符串,当做这个对象的描写
1. __init__和__delete__
__init__()函数的意义等同于类的构造器(同理,__del__()等同于类的析构函数)。因此,__init__()方法的作用是创建一个类的实例。
2. __call__
__call__()的作用是使实例能够像函数一样被调用,同时不影响实例本身的生命周期(__call__()不影响一个实例的构造和析构)。但是__call__()可以用来改变实例的内部成员的值。
3. __new__
__new__方法的调用是发生在__init__之前的, __new__发生在实例化之前,__init__初始化发在实例化之后 所以可以用__new__简单实现单例。
#用__new__实现单例
class Singleton(object):
def __new__(cls):
if not hasattr(cls,'instance'):
cls.instance = super().__new__(cls)
return cls.instance
obj1 = Singleton()
obj2 = Singleton()
print(obj1==obj2) #True
4. __str__
__str__是被print函数调用的,一般都是return一个字符串。当打印一个类的时候,那么print首先调用的就是类里面的定义的__str__
博观而约取,厚积而薄发。