导读:本篇文章首席CTO笔记来给大家介绍有关django一对一如何在前端实现浅谈的相关内容,希望对大家有所帮助,一起来看看吧。
求助django 实现前端页面检索功能的代码
设我们的 django 博客应用有如下的文章模型:
blog/models.pyclass Post(models.Model):
# 标题
title = models.CharField(max_length=70)
# 正文
body = models.TextField()
# 其他属性
def __str__(self):
return self.title
先看到第 1 步,用户在搜索框输入搜索关键词,因此我们要在博客上为用户提供一个搜索表单,html 表单代码大概像这样:
form method=\"get\" action=\"/search/\"
{% csrf_token %} input type=\"search\" placeholder=\"搜索\" required
button type=\"submit\"搜索/button/form
特别注意在 form 标签下有一个 {% csrf_token %},这是 django 用来防御跨站请求伪造(CSRF)攻击的机制。如果不知道什么是 CSRF 的话也没有关系,只要记住在使用 django 时,前端的表单代码里一定要加上 {% csrf_token %}。
用户输入了搜索关键词并点击了搜索按钮后,数据就被发送给了 django 后台服务器。表单的 action 属性的值为 /search/,表明用户提交的结果将被发送给 /search/ 这个 URL。我们为这个 URL 绑定一个 django 视图函数,在这个视图函数里完成前面第 2 步提到的过程。假设我们把视图函数的代码写在 blog/views.py 里:
blog/views.pydef search(request):
q = request.GET.get(\'q\')
error_msg = \'\'
if not q:
error_msg = \'请输入关键词\'
return render(request, \'blog/errors.html\', {\'error_msg\': error_msg})
post_list = Post.objects.filter(title__icontains=q)
return render(request, \'blog/results.html\', {\'error_msg\': error_msg,
\'post_list\': post_list})
首先我们使用 request.GET.get(\'q\') 获取到用户提交的搜索关键词。用户通过表单提交的数据 django 为我们保存在 request.GET 里,这是一个类似于 Python 字典的对象,所以我们使用 get 方法从字典里取出键 q 对应的值,即用户的搜索关键词。这里字典的键之所以叫 q 是因为我们的表单中搜索框 input 的 name 属性的值是 q,如果修改了 name 属性的值,那么这个键的名称也要相应修改。
接下来我们做了一个小小的校验,如果用户没有输入搜索关键词而提交了表单,我们就无需执行查询,而是渲染一个错误页面提示用户请输入关键词。
如果用户输入了搜索关键词,我们就通过 filter 方法从数据库里过滤出符合条件的所有文章。这里的过滤条件是 title__icontains=q,即 title 中包含(contains)关键字 q,前缀 i 表示不区分大小写。这里 icontains 是查询表达式(Field lookups),其用法是在模型需要筛选的属性后面跟上两个下划线。django 内置了很多查询表达式,建议过一遍 django 官方留个印象,了解每个表达式的作用,以后碰到相关的需求就可以快速定位到文档查询其用途:Field lookups
接下来就是渲染搜索结果页面,显示符合搜索条件的文章列表,下面是一个模板的简单示例:
results.html
{% if error_msg %} p{{ error_msg }}/p{% endif %}
{% for post in post_list %} div
在这里显示文章的相应信息 /div{% empty %} div class=\"no-post\"
没有搜索到符合条件的文章 /div{% endfor %}
有了视图函数后记得把视图函数映射到相应了 URL,前面我们表单数据提交的 URL 为 /search/,因此将视图函数 search 绑定到该 URL 上。
blog/urls.pyurlpatterns = [
# 其他 url 配置
url(r\'^search/$\', views.search, name=\'search\'),]
大功告成!
用pyqt做好了前端,想用django做服务器,想问一下大概怎么搭建呢?
一般客户端(也就是你说的前段)跟服务器端(你准备使用Django)都是通过 HTTP 协议交换信息的(除非有特别的需求,才会使用别的或者定制协议)。
在 客户端(PyQT)中,你可以安装 Requests 库,它可以帮助你发送 HTTP 请求给服务器端,
在 Django 中你可以使用 Django REST Framework 网页链接处理 客户端的HTTP请求。
[Django] 如何在Django中使用前端工具链
Django最大的不足在于其落后的前端工具链。现在前端开发几乎必备的包管理器(例如npm,yarn)以及工程化必备的webpack工具链,Django却不支持。Django开发的工作流中,后端的包管理可以用pip,而前端的包只能手动管理。所以,我最近的工程项目中,已不再使用Django提供的前端模块,仅仅把它当作API服务器。这的确很遗憾,因为Django的template引擎也有一些易用的特性,如此抛弃,真的有点不舍。那么有没有可能结合二者的优点呢?
经过一番探索,网上给出最靠谱的答案就是利用 django-webpack-loader 和 webpack-bundle-tracker 这两个插件。其原理是 webpack-bundle-tracker 能够输出webpack的编译过程以及结果。 django-webpack-loader 插件则是Django和webpack之间的桥梁,利用上面的编译结果,自动加载webpack打包后的静态文件。
需要用webpack生成的静态文件时,就在template上面使用下面一段模板语言,能够自动完成静态文件的注入。
简单的试了试,应该能够达到我想要的效果,明天有时间再研究。
Django接受前端数据的几种方法
字符型
字符型的数据相对好获取,前端传递的方法如下:
sendData = { \"exporttype\": exporttype,
\"bugids\": bugids,
\"test\": JSON.stringify({\"test\": \"test\"})
};
在Django的后端只要使用exporttype = request.GET.get(\"exporttype\")
就能正常的获取到这个数据了。
注意: 在Python2.7中数据是unicode编码的,如果要使用,有时候需要进行转str
结果示例:
Excle type \'unicode\'
数组型
获取数组型的数据如果使用获取字符串的数据的方法,打出的结果是None。我们要使用这个方法:
bugids = request.GET.getlist(\"bugids[]\")
这样获取的数据就是数组类型。
注意: 获取的数组中的元素是unicode编码的,在某些时候使用需要转编码
结果示例:
•传递的url
[14/Jul/2016 11:00:41]\"GET /testtools/exportbug/?exporttype=Exclebugids%5B%5D=102bugids%5B%5D=101bugids%5B%5D
•获取的数据
[u\'102\', u\'101\', u\'100\', u\'99\', u\'98\', u\'97\', u\'96\', u\'95\', u\'94\', u\'93\', u\'92\', u\'91\', u\'90\', u\'89\', u\'88\', u\'87\'
字典型
字典型数据其实可以当成字符串数据来处理,获取到对应字符串后使用JSON模块做一下格式化就行了。
对于前端来说,传递字典型的数据就是传递JSON数据,所以使用的方法是:
\"test\": JSON.stringify({\"test\": \"test\"})
结果示例:
{\"test\":\"test\"} type \'unicode\'
相关源码
•Get方法
Get方法是wsgi里面的一个方法。
def GET(self):
# The WSGI spec says \'QUERY_STRING\' may be absent.
raw_query_string = get_bytes_from_wsgi(self.environ, \'QUERY_STRING\', \'\')
return http.QueryDict(raw_query_string, encoding=self._encoding)
最终返回的是一个http.QueryDict(raw_query_string, encoding=self._encoding)http的原始数据,而QueryDict继承于MultiValueDict ,所以我们直接看MultiValueDict就好了。
•MultiValueDict
其实源码看起来并不难。
def get(self, key, default=None):
\"\"\"
Returns the last data value for the passed key. If key doesn\'t exist
or value is an empty list, then default is returned.
\"\"\"
try:
val = self[key]
except KeyError:
return default
if val == []:
return default
return val
def getlist(self, key, default=None):
\"\"\"
Returns the list of values for the passed key. If key doesn\'t exist,
then a default value is returned.
\"\"\"
try:
return super(MultiValueDict, self).__getitem__(key)
except KeyError:
if default is None:
return []
return default
def __getitem__(self, key):
\"\"\"
Returns the last data value for this key, or [] if it\'s an empty list;
raises KeyError if not found.
\"\"\"
try:
list_ = super(MultiValueDict, self).__getitem__(key)
except KeyError:
raise MultiValueDictKeyError(repr(key))
try:
return list_[-1]
except IndexError:
return []
结语:以上就是首席CTO笔记为大家介绍的关于django一对一如何在前端实现浅谈的全部内容了,希望对大家有所帮助,如果你还想了解更多这方面的信息,记得收藏关注本站。
以上内容为新媒号(sinv.com.cn)为大家提供!新媒号,坚持更新大家所需的互联网后端知识。希望您喜欢!
版权申明:新媒号所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流,不声明或保证其内容的正确性,如发现本站有涉嫌抄袭侵权/违法违规的内容。请发送邮件至 k2#88.com(替换@) 举报,一经查实,本站将立刻删除。