Django配置api、管理系统和视图
接着上一篇《Django搭建和数据迁移》继续写一些关于 django
的简单使用方法。
一、django的api
进入上一篇我们生成好的testsite
项目执行下面命令
bash
py manage.py shell
进入交互式 Python
命令行,可以使用 django
丰富的api
。
可以看到你的 Python
和 IPython
版本信息,
他的作用主要是对数据库模型的的增删改查,方便我们调试.
举个应用增加查询例子:
python
# 导入
from polls.models import Choice, Question
#查询
Question.objects.all()
from django.utils import timezone
q = Question(question_text="What's new?", pub_date=timezone.now())
# 保存
>>> q.save()
# 查看id
>>> q.id
二、django的管理界面
首先先创建一个管理员账号:
bash
py manage.py createsuperuser
然后依次输入你的用户名,邮箱,密码。
启动 django
服务。
bash
py manage.py runserver
访问 http://127.0.0.1:8000/admin/
这个地址就可以进入django
的管理界面。后面这个端口根据你启动命令监听端口来。
界面上的你group
和user
。它们是由django.contrib.auth
提供的,这是 Django
开发的认证框架。
我们怎么向管理界面加入一个应用呢?
进入我们前面创建好的的 members
应用,打开 admin.py
文件。加入下面 model
注册代码。
python
from django.contrib import admin
from .models import Question
admin.site.register(Question)
我们便注册好了 question
类。在我们刚刚打开的管理界面,就看到了注册好的question
应用。
我们就可以对它进行一系列curd
。
在这里插入图片描述
三、django的视图
Django
中的视图的概念是「一类具有相同功能和模板的网页的集合」。
我们为了向 members
应用添加更多视图,进入 members/views.py
:
c
def detail(request, question_id):
return HttpResponse("You're looking at question %s." % question_id)
def results(request, question_id):
response = "You're looking at the results of question %s."
return HttpResponse(response % question_id)
def vote(request, question_id):
return HttpResponse("You're voting on question %s." % question_id)
为了使这些视图他们能访问,就要把它们添加进入urls
模块里面。打开 members/urls.py
。
python
from django.urls import path
from . import views
urlpatterns = [
# ex: /members/
path('', views.index, name='index'),
# ex: /members/5/
path('<int:question_id>/', views.detail, name='detail'),
# ex: /members/5/results/
path('<int:question_id>/results/', views.results, name='results'),
# ex: /members/5/vote/
path('<int:question_id>/vote/', views.vote, name='vote'),
]
其实就是添加能访问视图的路由。然后进入我们的后台页面,加入我们想看 members
详情,
根据你写的路由进行访问即可,比如我要访问 detail
详情视图,根据路由访问http://127.0.0.1:8000/members/1
,就能进入详情视图啦!
当然这只是举例子,实际项目中每个视图必须要做的只有两件事:返回一个包含被请求页面内容的 HttpResponse
对象,或者抛出一个异常,比如 Http404
。
视图里面除了可以从数据库里读取记录,还可以使用任何你想用的 Python
库。
Django
只需要返回的是一个HttpResponse
,或者抛出一个异常就可以。
下面举个例子视图里面执行数据库查询,
python
from django.http import HttpResponse
from .models import 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)
进入members
目录创建一个模板目录 templates
,Django
将会在这个目录里查找模板文件。
然后在你刚刚创建的 templates
目录里,再创建一个目录 members
,然后在其中新建一个文件index.html
。
这时候你的模板文件的路径应该是 members/templates/members/index.html
。
因为app_directories
模板加载器是通过上述描述的方法运行的,所以 Django
可以引用到 members/index.html
这一模板了。
然后打开 members/templates/members/index.html
。
添加下面模板代码:
html
{% if latest_question_list %}
<ul>
{% for question in latest_question_list %}
<li><a href="/members/{{ question.id }}/">{{ question.question_text }}</a></li>
{% endfor %}
</ul>
{% else %}
<p>No members are available.</p>
{% endif %}
然后,让我们更新一下members/views.py
里的 index方法视图来使用模板:
python
from django.http import HttpResponse
from django.template import loader
from .models import Question
def index(request):
latest_question_list = Question.objects.order_by('-pub_date')[:5]
template = loader.get_template('members/index.html')
context = {
'latest_question_list': latest_question_list,
}
return HttpResponse(template.render(context, request))
这一步的目的是载入 members/index.html
模板文件,并且向它传递一个上下文(context)
。
然后访问 http://127.0.0.1:8000/members/
就可以看到我们向 question
视图数据里面插入的数据被查询出来的。
我们也可以使用下面方法查询视图,使用 render()
方法:
python
from django.shortcuts import render
from .models import Question
def index(request):
latest_question_list = Question.objects.order_by('-pub_date')[:5]
context = {'latest_question_list': latest_question_list}
return render(request, 'members/index.html', context)
再举个抛出错误的例子
python
from django.http import Http404
from django.shortcuts import render
from .models import Question
# ...
def detail(request, question_id):
try:
question = Question.objects.get(pk=question_id)
except Question.DoesNotExist:
raise Http404("Question does not exist")
return render(request, 'members/detail.html', {'question': question})
访问我们的地址 http://127.0.0.1:8000/members/2/
就可以看到出异常效果了,选一个数据库里面没有的数据。
也可以使用快捷函数 get_object_or_404()
达到同样的效果。
python
from django.shortcuts import get_object_or_404, render
from .models import Question
# ...
def detail(request, question_id):
question = get_object_or_404(Question, pk=question_id)
return render(request, 'members/detail.html', {'question': question})
怎么去除模板中的硬编码 URL
呢
我们在 members/index.html
里面代码是这样:
html
<li>
<a href="/members/{{ question.id }}/">
{{ question.question_text }}
</a>
</li>
为了方便修改,你可以使用{% url %}
标签代替它:
html
<li>
<a href="{% url 'detail' question.id %}">
{{ question.question_text }}
</a>
</li>
修改 members/urls
路由 detail
。
python
path('<int:question_id>/', views.detail, name='detail'),
如果想改变详情视图的 URL
,比如想改成 members/specifics/12/
,只要在 members/urls.py
里稍微修改一下就行:
python
path('specifics/<int:question_id>/', views.detail, name='detail'),
即可。
还可以在 members/urls.py
里面设置命名空间
python
from django.urls import path
from . import views
app_name = 'members'
urlpatterns = [
path('', views.index, name='index'),
path('<int:question_id>/', views.detail, name='detail'),
path('<int:question_id>/results/', views.results, name='results'),
path('<int:question_id>/vote/', views.vote, name='vote'),
]
四、总结
经过上面例子可以看到 django
给我们提供了非常方便的视图,路由,和后台模块,通过这些我们能够灵活去搭建和配置我们的项目,解决实际我们遇到的各色各样的系统开发。
特别是对于数据模型的友好支持,让开发人员的注意力更多放在设计和业务需求上面,django
良好的设计减少我们的代码开发复杂度。
对于 django
的视图路由系统,我们能很清晰的找到他们的映射关系,并且它本身也具有很多优点:比如添加命名空间,正则表达式匹配,各个应用之间分层导入,还包括错误处理等等,都值得我们进一步去学习和使用。
-- 欢迎点赞、关注、转发、收藏【我码玄黄】,gonghao同名