Django配置api、管理系统和视图

Django配置api、管理系统和视图

接着上一篇《Django搭建和数据迁移》继续写一些关于 django 的简单使用方法。

一、django的api

进入上一篇我们生成好的testsite项目执行下面命令

bash 复制代码
py manage.py shell

进入交互式 Python 命令行,可以使用 django 丰富的api

可以看到你的 PythonIPython 版本信息,

他的作用主要是对数据库模型的的增删改查,方便我们调试.

举个应用增加查询例子:

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的管理界面。后面这个端口根据你启动命令监听端口来。

界面上的你groupuser。它们是由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 目录创建一个模板目录 templatesDjango 将会在这个目录里查找模板文件。

然后在你刚刚创建的 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同名

相关推荐
waterHBO14 分钟前
python 爬虫 selenium 笔记
爬虫·python·selenium
kejijianwen1 小时前
JdbcTemplate常用方法一览AG网页参数绑定与数据寻址实操
服务器·数据库·oracle
编程零零七1 小时前
Python数据分析工具(三):pymssql的用法
开发语言·前端·数据库·python·oracle·数据分析·pymssql
AIAdvocate3 小时前
Pandas_数据结构详解
数据结构·python·pandas
小言从不摸鱼3 小时前
【AI大模型】ChatGPT模型原理介绍(下)
人工智能·python·深度学习·机器学习·自然语言处理·chatgpt
高兴就好(石4 小时前
DB-GPT部署和试用
数据库·gpt
这孩子叫逆5 小时前
6. 什么是MySQL的事务?如何在Java中使用Connection接口管理事务?
数据库·mysql
罗政5 小时前
[附源码]超简洁个人博客网站搭建+SpringBoot+Vue前后端分离
vue.js·spring boot·后端
Karoku0665 小时前
【网站架构部署与优化】web服务与http协议
linux·运维·服务器·数据库·http·架构
码农郁郁久居人下5 小时前
Redis的配置与优化
数据库·redis·缓存