1、创建Django项目
Pycharm+虚拟环境
新建Django项目即可。
配置库:
Django2.2
Pillow7.1.1
asgiref3.2.7
django-dajax0.9.2
django-dajaxice0.7
django-tinymce3.0.1
mysqlclient 1.4.6
numpy1.18.3
pandas1.0.3
pip20.0.2
python-dateutil 2.8.1
pytz2019.3
setuptools 40.8.0
sqlparse0.3.1
xlwt1.3.0
2、创建APP
python manage.py startapp login
- 每个Django项目中可以包含多个APP
- 相当于一个大型项目中的分系统、子模块、功能部件等等,相互之间比较独立,但也可以有联系。
- 所有的APP共享项目资源。
3、编写路由urls.py
- 路由是浏览器输入url,在Django服务器响应url的转发中心。
- 路由都写在urls文件里,它将浏览器输入的url映射到相应的业务处理逻辑也就是视图。
- URL文件将输入的地址,映射到对应的views.py里面的class或者function。
4、编写视图函数
- 视图函数处理用户请求,也就是编写业务处理逻辑。
- 对于接收到URL之后,映射到对应的views.py中对应的类中的处理方式。
- 在界面中输入提交,相当于post的方式提交数据,此时根据views.py中函数方法处理这些数据,处理之后返回处理后结果。
5、返回HTML文件
- 返回HTML,只需要在views.py中的函数里面,将对应的函数返回改为HTML文件即可。
return render(request,’index.html’)
render方法使用数据字典和请求元数据,渲染一个指定的HTML模板。其多个参数中,第一个参数必须是request,第二个是模板。
在templates目录中新建一个index.html文件。
为了让django知道我们的HTML文件在哪里,需要修改settings文件的相应内容。但默认情况下,它正好适用,无需修改。
TEMPLATES = [
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')]
6、 使用静态文件
我们已经可以将HTML文件返还给用户了,但是这还不够,前端三大块HTML、CSS、JavaScript,还有各种插件,它们齐全才是一个完整的页面。在Django中,一般将这些静态文件放在static目录中。
- 在mysite中新建一个static目录。拷贝了一个jquery-3.2.1.min.js
为了让Django知道这个static目录的存在,并能够找到这个目录,需要对settings进行配置:
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR,'static')
]
然后可以在index.html中引入js文件了
7、动态交互
在HTML中设置为post输入的方式
在views.py中的相关函数中设置if判断输入post接收数据。
8、 使用数据库
- 使用数据库前,我们需要注册app:
不注册它,你的数据库就不知道该给哪个app创建表。
在setting.py的installedapp里面加入即可。 - 然后我们在settings中,配置数据库相关的参数,如果使用sqlite3,则不需要做任何修改。
- 再编辑models.py文件,也就是MTV中的M。
这里我们创建了2个字段,分别保存用户的名字和密码。
接下来要在Pycharm的Teminal中通过命令创建数据库的表了。有2条命令,分别是:
python manage.py makemigrations
python manage.py migrate
- 现在,我们来修改views.py中的业务逻辑,在view中将数据存储到数据库中,并从数据库中读取数据。此间数据存储格式为列表里面包含字典。
建议:除了admin路由外,尽量给每个app设计自己独立的二级路由。
9、创建管理员用户
- 首先,我们需要通过下面的命令,创建一个可以登录admin站点的用户:
python manage.py createsuperuser
-
现在还无法看到投票应用,必须先在admin中进行注册,告诉admin站点,请将polls的模型加入站点内,接受站点的管理。
-
数据库表单管理
在model.py里面
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
创建列表。用于贴入数据库。
当然,创建完之后都需要更新数据库。
在admin.py里面,
admin.site.register(Question)
将数据库的内容添加到站点里面进行管理。
-
这里有个非常重要的问题:在当前视图中的HTML页面是硬编码的。如果你想改变页面的显示内容,就必须修改这里的Python代码。为了解决这个问题,需要使用Django提供的模板系统,解耦视图和模板之间的硬连接。
-
首先,在polls目录下创建一个新的templates目录,Django会在它里面查找模板文件。
-
项目的 TEMPLATES配置项描述了 Django 如何载入和渲染模板。默认的设置文件设置了 DjangoTemplates 后端,并将 APP_DIRS设置成了 True。这一选项将会让 DjangoTemplates 在每个 NSTALLED_APPS 文件夹中寻找 “templates” 子目录。这就是为什么尽管我们没有像在第二部分中那样修改 DIRS 设置,Django 也能正确找到 polls 的模板位置的原因。
-
在templates目录中,再创建一个新的子目录名叫polls,进入该子目录,创建一个新的html文件index.html。换句话说,你的模板文件应该是polls/templates/polls/index.html。因为 Django 会寻找到对应的app_directories ,所以你只需要使用polls/index.html就可以引用到这一模板了。
快捷方式:render()
-
在实际运用中,加载模板、传递参数,返回HttpResponse对象是一整套再常用不过的操作了,为了节省力气,Django提供了一个快捷方式:render函数,一步到位!
-
render()函数的第一个位置参数是请求对象(就是view函数的第一个参数),第二个位置参数是模板。还可以有一个可选的第三参数,一个字典,包含需要传递给模板的数据。最后render函数返回一个经过字典数据渲染过的模板封装而成的HttpResponse对象。
三种方式:
return HttpResponse("You're looking at question %s." % question_id)
try:
question = Question.objects.get(pk=question_id)
except Question.DoesNotExist:
raise Http404("Question does not exist")
return render(request, 'login/detail.html', {'question': question})
question = get_object_or_404(Question, pk=question_id)
return render(request, 'polls/detail.html', {'question': question})
三种描述方式对比:
# def index(request):
# latest_question_list = Question.objects.order_by('-pub_date')[:5]
# output = ','.join([q.question_text for q in latest_question_list])
# return HttpResponse(output)
#
# def index(request):
# latest_question_list = Question.objects.order_by('-pub_date')[:5]
# template = loader.get_template('login/index.html')
# context = {
# 'latest_question_list': latest_question_list,
# }
# return HttpResponse(template.render(context, request))
#
def index(request):
latest_question_list = Question.objects.order_by('-pub_date')[:5]
context = {'latest_question_list': latest_question_list}
return render(request, 'login/index.html', context)
forloop.counter
forloop.counter是DJango模板系统专门提供的一个变量,用来表示你当前循环的次数,一般用来给循环项目添加有序数标
-
由于我们发送了一个POST请求,就必须考虑一个跨站请求伪造的安全问题,简称CSRF(具体含义请百度)。Django为你提供了一个简单的方法来避免这个困扰,那就是在form表单内添加一条{% csrf_token %}标签,标签名不可更改,固定格式,位置任意,只要是在form表单内。这个方法对form表单的提交方式方便好使,但如果是用ajax的方式提交数据,那么就不能用这个方法了。
-
上面的detail、index和results视图的代码非常相似,有点冗余,这是一个程序猿不能忍受的。他们都具有类似的业务逻辑,实现类似的功能:通过从URL传递过来的参数去数据库查询数据,加载一个模板,利用刚才的数据渲染模板,返回这个模板。
static静态模板放在什么位置:
- Django的STATICFILES_FINDERS设置项中包含一个查找器列表,它们知道如何从各种源中找到静态文件。 其中一个默认的查找器是AppDirectoriesFinder,它在每个INSTALLED_APPS下查找static子目录,例如我们刚创建的那个static目录。admin管理站点也为它的静态文件使用相同的目录结构。
数据库外键在admin中展现:
- 在这个表单中,Question字段是一个select选择框,包含了当前数据库中所有的Question实例。Django在admin站点中,自动地将所有的外键关系展示为一个select框。在我们的例子中,目前只有一个question对象存在。
让站点的选项显示更多东西,默认只显示char:
- 通常,Django只显示__str()__方法指定的内容。但是很多时候,我们可能要同时显示一些别的内容。要实现这一目的,可以使用list_display属性,它是一个由字段组成的元组,其中的每一个字段都会按顺序显示在“change list”页面上,代码如下:
# polls/admin.pyclass QuestionAdmin(admin.ModelAdmin):
# ...
list_display = ('question_text', 'pub_date', 'was_published_recently')
采用内联的方式,外键就不会再单独显示。
显示搜索框,在admin里面修改。
search_fields = ['question_text']
-
这会在页面的顶部增加一个搜索框。当输入搜索关键字后,Django会在question_text字段内进行搜索。只要你愿意,你可以使用任意多个搜索字段,Django在后台使用的都是SQL查询语句的LIKE语法,但是有限制的搜索字段有助于后台的数据库查询效率。
-
创建了模型之后,在使用它之前,你需要先在settings文件中的INSTALLED_APPS 处,注册models.py文件所在的myapp。看清楚了,是注册app,不是模型,也不是models.py。如果你以前写过模型,可能已经做过这一步工作,可跳过。
-
模型字段fields
字段是模型中最重要的内容之一,也是唯一必须的部分。字段在Python中表现为一个类属性,体现了数据表中的一个列。请不要使用clean、save、delete等Django内置的模型API名字,防止命名冲突。下面是一个展示,注意字段的写法:
views.py
视图层是Django处理请求的核心代码层,我们大多数Python代码都集中在这一层面。
它对外接收用户请求,对内调度模型层和模版层,统合数据库和前端,最后根据业务逻辑,将处理好的数据,与前端结合,返回给用户。视图层是真正的后端,是Python工程师的‘主营业务’。
Django的视图层包含下面一些主要内容: -
URL路由 视图函数 快捷方式 装饰器 请求与响应 类视图 文件上传 CSV/PDF生成 内置中间件