Django视图测试报错AssertionError:未使用模板渲染响应
Django测试视图遇到AssertionError: No templates used to render the response问题解决
作为Django测试新手,我在测试视图时碰到了AssertionError: No templates used to render the response错误,现将相关代码和解决方法分享出来,帮到有需要的人。
相关代码
views.py
def all_programs(request): programs = Program.objects.all() return render(request, 'orders/all_programs.html', {'programs': programs}) def checkout(request, slug): if request.method == 'POST': # get data from form and save it program = get_object_or_404(Program, slug=slug) dates = ProgramDate.objects.filter(program=program) return render(request, 'orders/checkout.html', {'program': program, 'dates': dates})
urls.py
from django.urls import path from django.views.generic import RedirectView from .views import * app_name = 'orders' urlpatterns = [ path('', RedirectView.as_view(url='https://www.another-website.net')), path('tests/', all_programs, name='all_programs'), path('checkout/<str:slug>/', checkout, name='checkout'), path('checkout/return_page/', ReturnPage.as_view(), name='return_page'), ]
test_views.py(出错版本)
from django.test import TestCase from django.shortcuts import reverse class TestViews(TestCase): def test_all_programs(self): response = self.client.get(reverse('orders:all_programs')) self.assertTemplateUsed(response, 'orders/all_programs.html') def test_checkout(self): # error is here response = self.client.get(reverse('orders:all_programs', kwargs={'slug': 'test'})) # I tried this # response = self.client.get('http://127.0.0.1:8000/checkout/test/') #and this self.assertTemplateUsed(response, 'orders/checkout.html')
问题原因与解决方法
- URL反转错误:
test_checkout方法里调用reverse时,错误使用了orders:all_programs,应该对应checkout视图的名称orders:checkout。 - 缺少测试数据:视图里用了
get_object_or_404(Program, slug=slug),如果数据库里没有对应slug的Program实例,请求会返回404响应,不会渲染目标模板。
修正后的test_checkout方法:
def test_checkout(self): # 创建测试用的Program实例 program = Program.objects.create(slug='test', name='测试课程') # 正确反转checkout的URL response = self.client.get(reverse('orders:checkout', kwargs={'slug': 'test'})) self.assertTemplateUsed(response, 'orders/checkout.html')
另外,即使直接用硬编码URL访问/checkout/test/,如果没有提前创建对应数据,同样会触发404,导致模板未渲染的错误。
内容的提问来源于stack exchange,提问作者marwan mohamed
相关产品推荐
相关产品推荐

