Django配置api、管理系统和视图
一、django的api
进入上一篇我们生成好的testsite
项目执行下面命令
py manage.py shell
进入交互式 Python
命令行,可以使用 django
丰富的api
。
可以看到你的 Python
和 IPython
版本信息,
他的作用主要是对数据库模型的的增删改查,方便我们调试.
举个应用增加查询例子:
# 导入
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的管理界面
首先先创建一个管理员账号:
py manage.py createsuperuser
然后依次输入你的用户名,邮箱,密码。
启动 django
服务。
py manage.py runserver
访问 http://127.0.0.1:8000/admin/
这个地址就可以进入django
的管理界面。后面这个端口根据你启动命令监听端口来。
界面上的你group
和user
。它们是由django.contrib.auth
提供的,这是 Django
开发的认证框架。
我们怎么向管理界面加入一个应用呢?
进入我们前面创建好的的 members
应用,打开 admin.py
文件。加入下面 model
注册代码。
from django.contrib import admin
from .models import Question
admin.site.register(Question)
我们便注册好了 question
类。在我们刚刚打开的管理界面,就看到了注册好的question
应用。
我们就可以对它进行一系列curd
。
在这里插入图片描述
三、django的视图
Django
中的视图的概念是「一类具有相同功能和模板的网页的集合」。
我们为了向 members
应用添加更多视图,进入 members/views.py
:
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
。
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
,或者抛出一个异常就可以。
下面举个例子视图里面执行数据库查询,
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
。
添加下面模板代码:
{% 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方法视图来使用模板:
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()
方法:
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)
再举个抛出错误的例子
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()
达到同样的效果。
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
里面代码是这样:
<li>
<a href="/members/{{ question.id }}/">
{{ question.question_text }}
</a>
</li>
为了方便修改,你可以使用{% url %}
标签代替它:
<li>
<a href="{% url 'detail' question.id %}">
{{ question.question_text }}
</a>
</li>
修改 members/urls
路由 detail
。
path('<int:question_id>/', views.detail, name='detail'),
如果想改变详情视图的 URL
,比如想改成 members/specifics/12/
,只要在 members/urls.py
里稍微修改一下就行:
path('specifics/<int:question_id>/', views.detail, name='detail'),
即可。
还可以在 members/urls.py
里面设置命名空间
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同名
转载自:https://juejin.cn/post/7374347412191854628