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 == '0':
            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 == '0':
            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方法。

方法二更像是通過一次請求對模板做兩次的渲染。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM