Django同Python视图类关联多个HTML页面失败求助
解决Django同一视图类关联多个HTML页面的问题
问题原因
你之前把template_name设为列表的方式不对——Django的TemplateResponseMixin中,列表形式的template_name是用来按顺序查找第一个存在的模板,并非根据不同URL返回对应模板,所以不管访问哪个路径,都会渲染第一个找到的模板,达不到预期效果。
解决方案
方法1:URL中直接指定模板(最简单)
修改urls.py,在as_view()方法中传入template_name参数,覆盖类的默认属性:
urlpatterns = [ path( "diee/new", diee_view.DieeCreateView.as_view(template_name='diee_create.html'), name="diee_create", ), path( "diee/new/newthree", diee_view.DieeCreateView.as_view(template_name='diee_create_03.html'), name="diee_create_03", ), ]
视图类恢复默认单个模板(也可以不写,URL传入的参数优先级更高):
class DieeCreateView(DieeBaseView, FormView): """View to create a Diee""" form_class = DieeForm template_name = 'diee_create.html' # 作为默认值
方法2:重写get_template_names()动态返回模板
如果需要根据请求条件(比如URL名称、请求参数)动态切换模板,重写视图类的get_template_names()方法:
class DieeCreateView(DieeBaseView, FormView): """View to create a Diee""" form_class = DieeForm def get_template_names(self): # 根据当前URL的name判断返回对应模板 if self.request.resolver_match.url_name == 'diee_create_03': return ['diee_create_03.html'] # 默认返回原模板 return ['diee_create.html']
urls.py保持你原来的写法即可,无需额外修改。
方法3:继承视图类拆分(适合后续逻辑分化)
如果两个页面后续可能需要不同的逻辑处理,可以继承原视图类,仅修改template_name:
# 原视图类保持不变 class DieeCreateView(DieeBaseView, FormView): """View to create a Diee""" form_class = DieeForm template_name = 'diee_create.html' # 新建子类,指定新模板 class DieeCreate03View(DieeCreateView): template_name = 'diee_create_03.html'
然后修改urls.py对应路径指向子类:
urlpatterns = [ path( "diee/new", diee_view.DieeCreateView.as_view(), name="diee_create", ), path( "diee/new/newthree", diee_view.DieeCreate03View.as_view(), name="diee_create_03", ), ]
内容的提问来源于stack exchange,提问作者GotaKev
相关产品推荐
相关产品推荐

