创建项目
django-admin startproject Blog_1
启动项目,默认服务端口为8000
(端口占用可通过以下命令关闭占用端口:netstat -ano|findstr 8000、taskkill /pid 进程号/F)
python manage.py runserver
python manage.py runserver 8080
创建管理员用户
python manage.py createsuperuser
在后台管理页面添加应用
from django.contrib import admin
from .models import Blog
admin.site.register(Blog)
settings.py
1、修改数据库配置
默认数据库为sqlite,可通过修改setting.py可修改数据库为mysql
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'blog',
'HOST': 'localhost',
'PORT': '3306',
'USER': 'root',
'PASSWORD': '123456',
}
}
2、添加应用
在INSTALLED_APPS下添加app
3、修改时区
TIME_ZONE = 'Asia/Shanghai'
USE_TZ = False
4、修改中文
LANGUAGE_CODE = 'zh-hans'
创建应用
python manage.py startapp blog
数据库迁移
python manage.py makemigrations
python manage.py migrate
urls.py配置
1、在blog应用文件夹下新建urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index')
]
2、在 Blog_1/urls.py 文件的 urlpatterns 列表里插入一个 include()
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('blog/', include('blog.urls'))
]
models.py
1、整形:IntegerField
2、文本类型:TextField
max_length
2、图片类型:ImageField
3、时间类型:DateTimeField
auto_now_add #创建或添加对象时的时间, 修改或更新对象时, 不会更改时间
auto_now #凡是对对象进行操作(创建/添加/修改/更新),时间都会随之改变
4、文件类型:FileField
5、布尔值:BooleanField
6、外键:ForeignKey
to:关联的表
on_delete:当该表中的某条数据删除后,关联外键的操作
on_delete=None, # 删除关联表中的数据时,当前表与其关联的field的行为
on_delete=models.CASCADE, # 删除关联数据,与之关联也删除
on_delete=models.DO_NOTHING, # 删除关联数据,什么也不做
on_delete=models.PROTECT, # 删除关联数据,引发错误ProtectedError
on_delete=models.SET_NULL, # 删除关联数据,与之关联的值设置为null
on_delete=models.SET_DEFAULT, # 删除关联数据,与之关联的值设置为默认值
7、blank=True 此处的数据可以不填,默认情况下为False,也就意味着默认情况下,所输入的数据不得空;
null=True时,也就是说如果没有填写数据,此处用NULL来储存空值
views.py
get_object_or_404() #尝试用get()函数获取一个对象,如果不存在就抛出Http404错误
get_list_or_404() #尝试用filter()函数获取一组对象,如果不存在就抛出Http404错误
模板
1、在应用目录下新建一个名为templates的目录
2、在模版中使用变量,需要将变量放到 {{ 变量 }} 中
2、如果想要访问对象的属性,那么可以通过 对象.属性名 来进行访问
3、<li><a href="{% url 'detail' question.id %}">{{ question.question_text }}</a></li> #去除模板中的硬编码 URL
4、过滤器
{{ blog.content|truncatechars:30 }} #截取字符串前30
5、循环{% for %}{% endfor %}
forloop.counter #当前循环的下标。以1作为起始值
forloop.counter0 #当前循环的下标。以0作为起始值
forloop.first #是否是第一次遍历。
forloop.last #是否是最后一次遍历。
自定义应用界面和风格
1、在应用目录下新建一个名为static的目录,再创建一个polls子文件夹,新建style.css
2、html文件头添加以下内容
{% load static %}
<link rel="stylesheet" type="text/css" href="{% static 'style.css' %}">
3、静态文件加载404解决方法,修改settings.py
STATIC_URL = '/static/'
STATICFILES_DIRS = (os.path.join(BASE_DIR, "static"), )
django python交互式命令行
1、django manage.py shell
2、增
q = Question(question_text="What's new?", pub_date=timezone.now())
q.save()
q.choice_set.create(choice_text='Not much', votes=0)
3、查
Question.objects.all()
Question.objects.filter(id=1)
Question.objects.filter(question_text__startswith='What')
Question.objects.get(pub_date__year=current_year)
Question.objects.get(id=2)
q.choice_set.count()
4、删
c = q.choice_set.filter(choice_text__startswith='Just hacking')
c.delete()
POST
request.POST是一个类字典对象,让你可以通过关键字的名字获取提交的数据
例如request.POST['choice']以字符串形式返回选择的 Choice 的 ID
使用通用视图
1、改良URLconf,将<question_id> 改为 <pk>
path('<int:pk>/results/', views.ResultsView.as_view(), name='results')
2、改良视图
class DetailView(generic.DetailView):
model = Question
template_name = 'polls/detail.html'
自定义后台表单
admin.py
1、改变字段排序
class QuestionAdmin(admin.ModelAdmin):
fields = ['pub_date', 'question_text']
admin.site.register(Question, QuestionAdmin)
2、将表单分为几个字段集(fieldsets 元组中的第一个元素是字段集的标题)
class QuestionAdmin(admin.ModelAdmin):
fieldsets = [
(None, {'fields': ['question_text']}),
('Date information', {'fields': ['pub_date']}),
]
admin.site.register(Question, QuestionAdmin)
Django自带的分页器
from django.core.paginator import Paginator #导入分页器
from blog.models import Blog #自己的模型对象
blogs = Blog.objects.all() #获取全部博文
pages = Paginator(blogs, 10) #每10个博文对象分为1页
#分页器相关的方法和属性
print pages.count #得到里面总共有多少个模型对象
print pages.num_pages #总页数
print pages.page_range #页面列表,可以拿来遍历得到全部页码
#得到第1页包含的模型对象,该对象集合可以用于遍历得到里面的模型对象
blogs_page = pages.page(1)
print blogs_page.number #得到该对象集合当前是哪一页
print blogs_page.has_previous() #判断是否有前一页
print blogs_page.has_next() #判断是否有后一页
浙公网安备 33010602011771号