详解Django的 render() 函数:渲染模板

  • Post category:Python

Django的render()函数用于从给定的数据渲染一个模板并返回一个HttpResponse对象,其语法如下:

render(request, template_name, context=None, content_type=None, status=None, using=None)
  • request:HttpRequest对象,表示来自客户端的请求。
  • template_name:要使用的模板名称,可以是文件名字符串、文件名列表或者是一个可调用的对象。如果给定名称不包含任何“/”,那么默认搜索的是app目录内的templates目录。
  • context:可选的上下文数据字典,它包含将要被渲染的模板所需的数据。如果不提供该参数,将自动提取与视图函数所绑定的上下文。
  • content_type:可选的MIME类型,默认为”text/html”。
  • status:可选的HTTP响应状态码,默认为200。
  • using:可选的数据库路由别名,默认为None。

下面提供两个使用render()函数的实例:

实例1:使用render()函数渲染模板并返回HttpResponse对象

# views.py
from django.shortcuts import render

def hello_view(request):
    return render(request, 'hello.html', {'name': 'World'})

# hello.html
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Hello</title>
    </head>
    <body>
        <h1>Hello, {{ name }}!</h1>
    </body>
</html>

在上面的例子中,hello_view()函数接受来自客户端的请求并使用render()函数渲染名为“hello.html”的模板。模板接受一个名为”name”的上下文变量并将其输出为页面中的”Greetings, World!”。最后,该视图函数返回渲染后的HttpResponse对象,将该响应发送回客户端。

实例2:使用render()函数在Django Admin中自定义模板

# admin.py
from django.contrib import admin
from django.urls import reverse
from django.utils.html import format_html
from django.shortcuts import render

from .models import Product

class ProductAdmin(admin.ModelAdmin):

    list_display = ('name', 'description', 'view_on_site')

    def view_on_site(self, obj):
        url = reverse('product_detail', args=[obj.pk])
        return format_html('<a href="{}">View on site</a>', url)

    def change_view(self, request, object_id, form_url='', extra_context=None):
        product = Product.objects.get(pk=object_id)
        related_products = product.related_products.all()
        context = {'related_products': related_products}
        return render(request, 'change_view.html', context)

# change_view.html
{% extends "admin/change_form.html" %}

{% block object-tools %}
    {{ block.super }}
    <a href="{% url 'product_detail' object_id %}" class="button">View on site</a>
{% endblock %}

{% block after_field_sets %}
    <h3>Related Products:</h3>
    <ul>
        {% for related_product in related_products %}
        <li><a href="{% url 'admin:store_product_change' related_product.id %}">{{ related_product.name }}</a></li>
        {% endfor %}
    </ul>
{% endblock %}

在上面的例子中,我们使用render()函数自定义了ProductAdmin的改变视图。在视图更改时,我们将数据从数据库中检索出来,然后渲染名为”change_view.html”的模板,该模板继承自Django Admin的默认change_form.html,并允许我们在相关产品下面显示相关产品的列表,以供更好的参考。最后,该视图函数使用render()函数渲染了该模板,返回渲染后的HttpResponse对象,将其发送给客户端。

以上就是Django的render()函数的作用与使用方法的攻略。这个函数是Django中非常常用的一个函数,理解该函数的使用方法可以帮助我们更好地构建Django应用。