django中将views.py中的python方法传递给html模板文件
常规的模板渲染
from django.db import models # Create your models here. class ArticalType(models.Model):
caption = models.CharField(max_length=16) class Category(models.Model):
caption = models.CharField(max_length=16) class Artical(models.Model):
title = models.CharField(max_length=32)
content = models.CharField(max_length=255) category = models.ForeignKey(Category, on_delete=models.CASCADE)
artical_type = models.ForeignKey(ArticalType, on_delete=models.CASCADE)
models.py
urlpatterns = [
path('admin/', admin.site.urls),
re_path('artical-(?P<artical_type_id>\d+)-(?P<category_id>\d+).html', backend.artical),
]
urls.py
from django.shortcuts import render
from jax import models def artical(request, *args, **kwargs):
print(kwargs)
artical_type = models.ArticalType.objects.all()
category = models.Category.objects.all()
for k,v in kwargs.items():
if v == '':
artical = models.Artical.objects.all()
else:
artical = models.Artical.objects.filter(**kwargs)
return render(request, "artical.html",
{"artical_type": artical_type,
"category": category,
"artical": artical,})
views.py
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.tag a{
display: inline-block;
padding: 3px 5px;
border: 1px solid #dddddd;
margin: 5px 5px;
{#text-decoration: none;#}
}
.tag a.w{
background: #2459a2;
}
</style>
</head>
<body>
<h1>搜索条件</h1>
<div class="tag">
<div>
{% if artical_list.artical_type_id == 0 %}
<a class="w" href="/artical-0-{{ artical_list.category_id }}.html">全部</a>
{% else %}
<a href="/artical-0-{{ artical_list.category_id }}.html">全部</a>
{% endif %}
{% for row in artical_type %}
{% if row.id == artical_list.artical_type_id %}
<a class="w" href="/artical-{{ row.id }}-{{ artical_list.category_id }}.html">{{ row.caption }}</a>
{% else %}
<a href="/artical-{{ row.id }}-{{ artical_list.category_id }}.html">{{ row.caption }}</a>
{% endif %}
{% endfor %}
</div>
<div>
{% if artical_list.category_id == 0 %}
<a class="w" href="/artical-{{ artical_list.artical_type_id }}-0.html">全部</a>
{% else %}
<a href="/artical-{{ artical_list.artical_type_id }}-0.html">全部</a>
{% endif %}
{% for row in category %}
{% if row.id == artical_list.category_id %}
<a class="w" href="/artical-{{ artical_list.artical_type_id }}-{{ row.id }}}}.html">{{ row.caption }}</a>
{% else %}
<a href="/artical-{{ artical_list.artical_type_id }}-{{ row.id }}.html">{{ row.caption }}</a>
{% endif %}
{% endfor %}
</div>
</div>
<h1>搜索结果</h1>
<ul>
{% for row in artical %}
<li>{{ row.id }} - {{ row.title }}</li>
{% endfor %}
</ul> </body>
</html>
artical.html
将views.py中的python方法传递给html模板文件:
from django.shortcuts import render
from jax import models def artical(request, *args, **kwargs):
print(kwargs)
artical_type = models.ArticalType.objects.all()
category = models.Category.objects.all()
for k,v in kwargs.items():
kwargs[k] = int(v) # 新添加
if v == '':
artical = models.Artical.objects.all()
else:
artical = models.Artical.objects.filter(**kwargs)
return render(request, "artical.html",
{"artical_type": artical_type,
"category": category,
"artical": artical,
'artical_list': kwargs}) # 新添加
views.py
在app下新建目录templatetags(必须为这个名字),里面可以自定义文件名称,这里定义为filter.py
from django import template
from django.utils.safestring import mark_safe
register = template.Library() @register.simple_tag
def filter_all(artical_list, k):
'''
{% if artical_list.artical_type_id == 0 %}
<a class="w" href="/artical-0-{{ artical_list.category_id }}.html">全部</a>
{% else %}
<a href="/artical-0-{{ artical_list.category_id }}.html">全部</a>
{% endif %}
:return:
'''
if k == "artical_type_id":
n1 = artical_list["artical_type_id"]
n2 = artical_list["category_id"]
if n1 == 0:
ret = '<a class="w" href="/artical-0-%s.html">全部</a>' % n1
else:
ret = '<a href="/artical-0-%s.html">全部</a>' % n2
else:
n1 = artical_list["category_id"]
n2 = artical_list["artical_type_id"]
if n1 == 0:
ret = '<a class="w" href="/artical-%s-0.html">全部</a>' % n2
else:
ret = '<a href="/artical-%s-0.html">全部</a>' % n2
return mark_safe(ret) @register.simple_tag
def filter_artical_type(artical_type, artical_list):
"""
{% for row in artical_type %}
{% if row.id == artical_list.artical_type_id %}
<a class="w" href="/artical-{{ row.id }}-{{ artical_list.category_id }}.html">{{ row.caption }}</a>
{% else %}
<a href="/artical-{{ row.id }}-{{ artical_list.category_id }}.html">{{ row.caption }}</a>
{% endif %}
{% endfor %}
:return:
"""
ret = []
for row in artical_type:
if row.id == artical_list["artical_type_id"]:
temp = '<a class="w" href="/artical-%s-%s.html">%s</a>' % (row.id, artical_list["category_id"],row.caption)
else:
temp = '<a href="/artical-%s-%s.html">%s</a>' % (row.id, artical_list["category_id"], row.caption)
ret.append(temp)
return mark_safe(''.join(ret)) @register.simple_tag
def filter_category(category, artical_list):
"""
{% for row in category %}
{% if row.id == artical_list.category_id %}
<a class="w" href="/artical-{{ artical_list.artical_type_id }}-{{ row.id }}}}.html">{{ row.caption }}</a>
{% else %}
<a href="/artical-{{ artical_list.artical_type_id }}-{{ row.id }}.html">{{ row.caption }}</a>
{% endif %}
{% endfor %}
:param category:
:param artical_list:
:return:
"""
ret = []
for row in category:
if row.id == artical_list["category_id"]:
temp = '<a class="w" href="/artical-%s-%s.html">%s</a>' % (artical_list["artical_type_id"], row.id, row.caption)
else:
temp = '<a href="/artical-%s-%s.html">%s</a>' % (artical_list["artical_type_id"], row.id, row.caption)
ret.append(temp)
return mark_safe(''.join(ret))
filter.py
前端html文件倒入方法,以及传递参数
{% load filter %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.tag a{
display: inline-block;
padding: 3px 5px;
border: 1px solid #dddddd;
margin: 5px 5px;
{#text-decoration: none;#}
}
.tag a.w{
background: #2459a2;
}
</style>
</head>
<body>
<h1>搜索条件</h1>
<div class="tag">
<div>
{% filter_all artical_list 'artical_type_id' %}
{# {% if artical_list.artical_type_id == 0 %}#}
{# <a class="w" href="/artical-0-{{ artical_list.category_id }}.html">全部</a>#}
{# {% else %}#}
{# <a href="/artical-0-{{ artical_list.category_id }}.html">全部</a>#}
{# {% endif %}#}
{% filter_artical_type artical_type artical_list %}
{# {% for row in artical_type %}#}
{# {% if row.id == artical_list.artical_type_id %}#}
{# <a class="w" href="/artical-{{ row.id }}-{{ artical_list.category_id }}.html">{{ row.caption }}</a>#}
{# {% else %}#}
{# <a href="/artical-{{ row.id }}-{{ artical_list.category_id }}.html">{{ row.caption }}</a>#}
{# {% endif %}#}
{# {% endfor %}#}
</div>
<div>
{% filter_all artical_list 'category_id' %}
{# {% if artical_list.category_id == 0 %}#}
{# <a class="w" href="/artical-{{ artical_list.artical_type_id }}-0.html">全部</a>#}
{# {% else %}#}
{# <a href="/artical-{{ artical_list.artical_type_id }}-0.html">全部</a>#}
{# {% endif %}#}
{% filter_category category artical_list %}
{# {% for row in category %}#}
{# {% if row.id == artical_list.category_id %}#}
{# <a class="w" href="/artical-{{ artical_list.artical_type_id }}-{{ row.id }}}}.html">{{ row.caption }}</a>#}
{# {% else %}#}
{# <a href="/artical-{{ artical_list.artical_type_id }}-{{ row.id }}.html">{{ row.caption }}</a>#}
{# {% endif %}#}
{# {% endfor %}#}
</div>
</div>
<h1>搜索结果</h1>
<ul>
{% for row in artical %}
<li>{{ row.id }} - {{ row.title }}</li>
{% endfor %}
</ul>
</body>
</html>
artical.html
转换时需要注意:
1.在app下新建的目录名字必须为templatetags。
2.html文件第一行需要添加"{% load 文件名 %}",以此来倒入自定义前端方法中的函数。
3.新建的函数文件中需要倒入模块
from django import template
from django.utils.safestring import mark_safe
register = template.Library() 以及需要对自定义方法添加装饰器
@register.simple_tag
def fun(*args, **kwargs):
pass
方法二:
在templatetags目录中新建py文件,这里的"blog_left_menu.html"是另一个html模板文件
from jax import models
from django import template register = template.Library() @register.inclusion_tag("blog_left_menu.html")
def function():
...
# 这里function()里面处理后数据返回仍然需要以字典形式返回给"blog_left_menu.html",直接用return返回字典即可,不需要render。
其他模板引用方法:
{% load blog_left_menu %} <!--导入templatetags目录当中的文件-->
{% get_left_menu username %} <!--引用所倒入文件blog_left_menu.py中的get_left_menu方法,并且提供username作为参数}-->
方法一是正常的将前端代码转换为py方法。
方法二更像是通过一次请求对模板做两次的渲染。
django中将views.py中的python方法传递给html模板文件的更多相关文章
- Django Admin 在内联中覆盖保存方法(admin.TabularInline)
一 使用环境 开发系统: windows IDE: pycharm 数据库: msyql,navicat 编程语言: python3.7 (Windows x86-64 executable in ...
- html中引入调用另一个公用html模板文件的方法
html中引入调用另一个公用html模板文件的方法 https://www.w3h5.com/post/53.html 这里我使用jquery的方法 <body> <div id=& ...
- django之 使用views.py里面的函数对表进行增删改查 内容(models.py中表的创建、views.py中函数的使用,基于对象的跨表查询)
models之对于表的创建有以下几种: 一对一:ForeignKey("Author",unique=True), OneToOneField("Author" ...
- javascript中的值如何传递到django下的views.py中或者数据库中?
用Ajax,Ajax有很多种写法,包括JQuery和JS,这里贴一个用JQuery写的最通用的Ajax,POST方法传递JSON格式数据: $.ajax({ url: "your url&q ...
- [Django笔记] views.py 深入学习
views.py 是django MTV 中的主要逻辑层,相当于MVC中的 Controller 以下的实例都基于这样一个路由表: urlpatterns = [ url(r'^(index)?$', ...
- Django之views.py视图函数学习
视图函数: 视图函数时存在django项目中的应用程的一个名为views.py的文件模块: 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 一 ...
- C#中调用python方法
最近因为项目设计,有部分使用Python脚本,因此代码中需要调用python方法. 1.首先,在c#中调用python必须安装IronPython,在 http://ironpython.codepl ...
- Django 向数据表中添加字段方法
在模型order中添加字段discount字段,并给予初始值0 方法: 先在models.py中修改模型 添加 discount = models.DecimalField(max_digits=8, ...
- django之创建第4个项目编写第一个动态模板文件
修改的地方: 1.index.html <!DOCTYPE html> <html lang="en"> <head> <meta cha ...
随机推荐
- 机器学习:衡量线性回归法的指标(MSE、RMSE、MAE、R Squared)
一.MSE.RMSE.MAE 思路:测试数据集中的点,距离模型的平均距离越小,该模型越精确 # 注:使用平均距离,而不是所有测试样本的距离和,因为距离和受样本数量的影响 1)公式: MSE:均方误差 ...
- Shell脚本把文件从GBK转为UTF-8编码
http://www.jb51.net/article/51308.htm 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 ...
- linux 命令 chown, cp $
文件拷贝命令: sudo cp /xxx/XXX $HOME/ 改权限: sudo chwon $(id -u): $(id -g) $HOME/admin.conf 加入环境变量: ex ...
- 【SymmetricDS】SymmetricDS是如何工作的
2018-04-20 by 安静的下雪天 http://www.cnblogs.com/quiet-snowy-day/p/8890785.html 本文翻译自SymmetricDS官方文档 ...
- Centos 7.2 编译安装 git
一. 下载最新版GIT安装包: https://www.kernel.org/pub/software/scm/git/ 选择想要安装的版本,下载,解压 命令: .tar.gz $ cd git- 二 ...
- 使用setTimeout 来实现setInterval的效果
直接上代码,实现的核心就是在延时的情况下递归的调用自己, x=0 y=-1 function countMin( ) { y=y+1 document.displayMin.displayBox.va ...
- js调试的一点小知识
1.如果想要js代码被XHTML和HTML解析,就可以使用如下方式 <script type="text/javascript"> //<![CDATA[ fun ...
- 查看hdfs各目录分别占用多少空间
之前在网上搜索到的全部单位好像都是byte的,看起来很麻烦,然后自己看了下 hadoop fs -help [hadoop@slave3 java]$ hadoop fs -help Usage: h ...
- Android按钮单击事件的四种常用写法
这篇文章主要介绍了Android按钮单击事件的四种常用写法总结,比较了常见的四种写法的优劣,有不错的参考借鉴价值,需要的朋友可以参考下 很多学习Android程序设计的人都会发现每个人对代码的写法都有 ...
- shell直接退出后 后台进程关闭的原因和对处
在linux上进行测试时发现启动后台进程后,如果使用exit退出登录shell,shell退出后后台进程还是能够正常运行,但如果直接关闭登陆的窗口(如直接关掉xshell),那后台进程就会一起终了.都 ...