如果你不使用模板系统,是否可以用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
- 元素内的目标 字典的所有键。我们还使用了Django的reverse()函数来计算href值,以用于应用程序中的nameurl。一旦HTML被适当地建立起来,它就会以HttpResponse的形式返回给网络浏览器。对这个非常简单的应用程序进行测试表明它工作得很好。