在没有模板的情况下在Django中渲染HTML

121 阅读2分钟

Render HTML In Django Without A Template

如果你不使用模板系统,是否可以用Django渲染HTML?是的,是可以这样做的。为了在Django中不使用模板来渲染HTML,我们需要手动建立一个HTML字符串,并将其作为HttpResponse发送给浏览器。这样渲染HTML并不理想,但这是一个很好的练习,可以真正了解Django是如何处理请求、响应和渲染HTML的。


创建一个HTML主页

这个Django应用程序这一步的目标是添加一个主页,所有的目标都列在一个无序的列表中。列表中的每一个项目都应该被包裹在一个锚标签中,以使其可以点击查看更多信息。所以首先,我们需要在urls.py中添加一个代表主页的路由。

C:\python\djangoprojects\myproject\goals\urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('', views.homepage),
    path('<int:timeframe>', views.goals_by_int_timeframe),
    path('<str:timeframe>', views.goals_by_timeframe, name='namedurl'),
]

定义主页视图

这个新添加的路由指向views.py中的homepage函数。我们现在可以添加这个函数了。

C:\python\djangoprojects\myproject\goals\views.py

from django.shortcuts import redirect, render
from django.http import HttpResponse, HttpResponseRedirect
from django.urls import reverse

# dictionary data store
goals = {
    'daily': 'Learn Something New',
    'weekly': 'Take a day off',
    'monthly': 'Complete a creative course'
}


def homepage(request):
    goal_list = '<html><body><ul>'
    for goal in goals.keys():
        href = reverse('namedurl', args=[goal])
        goal_list += f'<li><a href="{href}">{goal}</a></li>'
    goal_list += '</ul></body></html>'
    return HttpResponse(goal_list)


def goals_by_int_timeframe(request, timeframe):
    timeframes = list(goals.keys())
    redirect_to = timeframes[timeframe - 1]
    named_redirect = reverse('namedurl', args=[redirect_to])
    return HttpResponseRedirect(named_redirect)


def goals_by_timeframe(request, timeframe):
    goal = goals[timeframe]
    return HttpResponse(goal)

homepage()函数如何工作

在之前的几篇教程中,我们一直在用包含简单字符串的响应来回应请求。这展示了Django中的请求和响应循环是如何工作的,但更好的方法是将HTML渲染给浏览器。所以这个homepage()函数所做的是构建一个Python字符串,它是由有效的HTML组成的,网络浏览器可以渲染。第一步是创建一个名为goal_list 的变量。我们首先分配了、和

    等HTML标签的开头。接下来,我们使用Python的For Loop来建立HTML
  • 元素内的目标 字典的所有键。我们还使用了Djangoreverse()函数来计算href值,以用于应用程序中的nameurl。一旦HTML被适当地建立起来,它就会以HttpResponse的形式返回给网络浏览器。对这个非常简单的应用程序进行测试表明它工作得很好。