在一个文件夹下创建一个django项目,使用下面这个命令
django-admin startproject mysite
然后进入mysite文件夹下,启动server,
python manage.py runserver
在manage.py 的同一个目录下面,我们创建一个新的polls文件夹
python manage.py startapp polls
在polls中创建一个urls.py 然后写上这些代码
from django.urls import path
from . import views
urlpatterns=[
path('',views.index,name='index'),
]
然后再在mysite/urls中包含下面这段文字
urlpatterns = [
path('polls/',include('polls.urls')),
path('admin/', admin.site.urls),
]
from . import views
表示的是从当前文件夹下将这个视图文件给导入进来
这个目的是让管理文件找到上面的那个视图
我们在views中写上表示界面的代码,然后再在对应的url文件中写上这个视图的地址
例如下面
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello, world. You're at the polls index.")
在根url文件中指定我们使用的polls.url模块,例如下面这样
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('polls/', include('polls.urls')), 找到对应的视图文件
path('admin/', admin.site.urls),
]
'polls.apps.PollsConfig',
需要在seeting文件中,install_app中配置上这一项,方便找到文件
解决出现模版中的html文件找不到的事情
首先在主控文件中找到setting文件,然后在
加上DIRS中的那句话,不然他找不到路径
然后找到模版文件夹
然后点击,Mark as template file 这样他就可以找到这个模版文件
创建一个管理,然后可以在里面修改一些东西
python manage.py createsuperuser
Username:admin
Email address:1242388760@qq.com
然后输入密码
然后启动服务器,就可以得到管理界面
然后我们需要让管理界面知道,有一个对象需要被管理,于是在polls/admin.py 中添加几句话
from .models import Question
admin.site.register(Question)
需要注意的是,在views那个函数中是按照顺序进行启动的,如果把第一个index给改掉的话,就会导致出现错误。
视图都是采用模版的方式进行构造的
在polls中创建一个template/polls/文件夹,然后再创建一个index.html
就是创建一个和自身名字相同的应用文件
def index(request):
latest_question_list = Question.objects.order_by('-pub_date')[:5]
template = loader.get_template('polls/index.html')
context = {
'latest_question_list': latest_question_list,
}
return HttpResponse(template.render(context, request))
上式表明,载入一个模版文件,同时向他传递一个上下文,这个上下文是一个字典,他将模版中的对象映射为Python对象
render()函数,是一个很快的函数,载入模版,然后进行填充,然后返回HttpResponse对象
是一种基本的做法
而django采用的render函数,可以快速的
在app中一般没有settings文件,只是在哪个主要的project中,才有setting文件
已经安装的app,一定要在install_app之中注册一下,并且还需要在url中进行登记
完成注册之后,我们需要定义模版,就是在那个templates文件中
在view中的函数,第一个是request,然后第二个以及后面的参数都是可选的参数,来源其实就是url中的<int:num> <str:name> <double:dd> 这些参数而已。
在模版中一定要将地址写清楚,假如是在polls中的模版。第二个参数一定要写polls/xxxx
不然会找不到这个文件
model文件中其实是为了数据库而存在的,admin文件是可以在后台进行登陆管理,然后可以对数据库进行操作
当我们定义好一个model中的class后,我们需要执行这条命令,使数据得到同步
python manage.py makemigrations
然后就会发现这个指令被执行后,创建了一个新的表格
一定要执行这个命令,不然就会导致数据库设置的不一致
每一次对数据类的修改,以及对数据类的新建,都可以在migration文件中找到
如果继续进行下面的操作,可以真正的在数据库中创建这个表
python manage.py migrate
运行的其实就是那个生成的migrations.py 文件
在数据库中,我们首先插入一些数据,然后我们使用
python manage.py shell 打开django自己带的shell
from polls.model import user 导入当前这个包,
使用命令User.objects.all()(这个是无条件的查询)
将所有的对象给查询出来
如果是使用有条件的查询
使用这条命令进行,根据括号里的字段进行查找,例如下面的命令
User.objects.filter(name=’Tony’)括号里面的不一定要求是primary_key
User.objects.get(name=’tony’)
上面就是查询常用的三条指令
下面介绍插入的指令
User.objects.create(name=’ding’,password=1234)
还可以调用这个方法
user=User(name=’ddd’,password=’22222’)
user.save()
如果是修改数据,原则上是先进行查找,然后在进行修改,最后是进行一次save操作
user=User.objects.get(name=’ding’)
user.password=’123334’
user.save()
即可
同样的道理,我们也可以删除一个对象,
首先找到这个对象,然后在delete这个对象
user=User.objects.get(name=’ding’)
User.objects.delete(user)
在表单进行数据验证的时候,例如进行用户登录的时候,首先利用登录界面传过来的email_account
然后利用 u=user.objects.filter(email_account=email_account)
获得了一个query_set,
u.exists() 返回结果是不是一个true或者是false 凭借这个就可以判断这个query_set是不是一个空的。
也可以使用count=user.objects.count(email_account=email_account) 然后返回这个查询的数量值。
这时可以利用u=user.objects.get(email_account=email_account) 这个函数,查找出需要的值,然后通过dot访问符进行访问即可。
在django中会用到验证用户是不是已经登录的问题,在登录的时候,我们提前申明一个全局变量,user_name 然后在login中
global user_name
user_name=form.cleaned_data[‘user_name’]即可
在个人中心中使用的时候,直接表明自己应用这个值,
global user_name
然后就可以进行使用了。
在django中出现了下面的错误
django.db.utils.OperationalError: table "book" already exists
可以将对应的sqlit文件给删除掉,然后重新执行那两条命令,
或者是将migration文件夹中的升级文件给删除掉,然后再执行那两条命令即可。
注意自己数据库的键值
在django中模版的语法, {% %}这个是和逻辑相关的,{ { } }这个是和变量输出相关的
{% for preson in person_list %}
<p>{{ person }}</p>
{% endfor %}
这里指的就是将person_list中的person给拿出来,然后再将其按段显示出来
使用查询条件进行数据库的查询,需要使用django自带的Q函数
from django.db.models import Q
User.objects.filter(Q(age=10)&Q(password=’123’))
如果查询所有的名字为ding的人
User.objects.filter(name__contains=’ding’) 一定要注意是两个下滑线
如果需要查询多个数据条件
User.objects.filter(password__in[‘123’,’111’])
如果需要查询密码大于一个值
User.objects.filter(password__gt=1)
如果是查询大于等于的值,使用下面的查询语句
User.objects.filter(password__gte=1)
查询一个项小于或者是不小于,差不多和上面的语句一样
User.objects.filter(password__lt=1)
User.objects.filter(name__startswith=d)
同时如果是查找以什么单词结尾的人,也可以使用下面的语句
User.objects.filter(name__endswith=’g’)
如果是要找一个范围内的东西
User.objects.filter(birthday__range(‘1997-04-21’,’2019-11-3’))
一般来说,出现了这个错误,应该是
后面少了一个逗号。
对form.py的解析
django用来生成form表单代码和验证表单数据是不是合法的一个文件,可以在这里面自定义form表单类,一般来说,在form.py 中可以定义一些字段,用来判断前端传回来的字段是不是合理,同时生成form表单代码。
form 表单中成员也可以和html中的input元素建立一个映射关系,对于ModelForm来说,可以直接建立model字段和html form中的input元素来建立映射
form成员本身也是类,他们负责管理form中的数据,当form提交时,也可以进行数据验证,DateField其实就是一个验证管理日期的类,form类的方法,
form.is_valid():
### 其实就是验证上面的表单类是不是所有的都是正确的,当所有的都返回true时,才执行下面的语句。
django中运行流程分析
用户通过浏览器请求一个页面
URLConfig通过urls.py文件和请求的url找到对应的View
调用view中的参数
在view中可以通过models访问底层的数据
所有的Models-to-DB的交互都是通过manager来完成的
如果需要,views可以使用一个特殊的context
context被传给template用来生成页面
template使用filter和tag去渲染输出
输出被返回到view中
然后将response 返回到浏览器上,呈现给用户
阶段性的总结:
POST和GET方法是唯二可以处理表单的Http方法,POST方法是将表单中的数据进行打包,编码,然后发送给server,最后获取响应的方法,而GET方法是将要请求的东西直接转为字符串,然后在url中给发送回来。
在form表单中验证的时候,如果一直遇到返回false的情况,可能是html中的name和提交的表单的name不一致导致的,也有可能是你填的有问题
这条一定要注意,有好几回就是这样导致的问题。
Form 表单验证的时候,如果表单文件中有file的话,我们就需要
form = goods_form(request.POST, request.FILES)
并且一定要加上这句话
enctype="multipart/form-data"
如果不加这句话,会一直报错,表单验证不通过