在Django中使用TemplateView时设置Mimetype

时间:2011-07-29 00:46:47

标签: django django-templates

在使用TemplateView时,anyboy是否知道如何设置所需的mimetype,如:

urlpatterns = patterns('',
    url(r'^test\.txt$', TemplateView.as_view(template_name='staticpages/test.html')),

在这种情况下,我想将mimtype设置为“text / plain”

8 个答案:

答案 0 :(得分:40)

对于Django> = 1.5

TemplateView接受content_type参数。

来自@Meilo的应对示例

urlpatterns = patterns('',
    url(r'^test\.txt$', TemplateView.as_view(template_name='staticpages/test.html', content_type='text/plain')),

对于Django< 1.5

我认为只是调用TemplateView.as_view()是不可能的,但也许我错过了它(从源头), 但你可以做自己的课

class TextTemplateView(TemplateView):
    def render_to_response(self, context, **response_kwargs):
        response_kwargs['content_type'] = 'text/plain'
        return super(TemplateView, self).render_to_response(context, **response_kwargs)

你可以看看:

django.template.response => TemplateResponse
django.views.generic.base => TemplateView

如果你需要更有活力的东西:

from django.utils.decorators import classonlymethod


class ContentTypeTemplateView(TemplateView):

    @classonlymethod
    def as_view(cls, content_type='text/plain', **initargs):
        setattr(cls, 'content_type', content_type)
        return super(ContentTypeTemplateView, cls).as_view(**initargs)

    def render_to_response(self, context, **response_kwargs):
        response_kwargs['content_type'] = self.content_type
        return super(ContentTypeTemplateView, self).render_to_response(context, **response_kwargs)


urlpatterns = patterns('',
    url(r'^$', ContentTypeTemplateView.as_view(content_type='text/plain',
                                               template_name='staticpages/test.html'),
        name='index'),
)

使用Mixin

from django.core.exceptions import ImproperlyConfigured


class ContentTypeMixin(object):

    content_type = None

    def render_to_response(self, context, **response_kwargs):
        if not self.content_type:
            raise ImproperlyConfigured(
                "MimeTypeMixin rquires a definition of content_type")
        response_kwargs['content_type'] = self.content_type
        return super(ContentTypeMixin, self).render_to_response(context,
                                                             **response_kwargs)


class MyTxtView(ContentTypeMixin, TemplateView):
    content_type = 'text/plain'
    ....

答案 1 :(得分:19)

在Django 1.5中,TemplateView中的 content_type 参数添加了之前基于函数的视图中的相同功能。这样可以更轻松地设置所需的mimetype:

urlpatterns = patterns('',
    url(r'^test\.txt$', TemplateView.as_view(template_name='staticpages/test.html', content_type='text/plain')),

答案 2 :(得分:4)

我知道您要求使用TemplateView设置内容类型,但我会给您不同的答案,我认为这样会更干净,可以在低于1.5的Django版本中使用。

    url(r'^robots\.txt$', 'django.shortcuts.render', kwargs={
        'template_name': 'robots.txt',
        'content_type': 'text/plain',
    })

使用这种方法,您不需要导入任何内容或子类TemplateView,并对某些方法进行丑陋的覆盖。您可以简单地将旧技术用于基于功能的视图。

答案 3 :(得分:1)

最好的方法是继承TemplateView并覆盖render_to_response()方法:

class StaticPagesTest(TemplateView):
    template_name = 'staticpages/test.html'

    def render_to_response(self, context, **kwargs):
        return super(StaticPagesTest, self).render_to_response(context,
                     mimetype='text/plain', **kwargs)

答案 4 :(得分:1)

如果您不想扩展TemplateView,可以扩展TemplateResponse以设置mimetype:

from django.template.response import TemplateResponse

class TextResponse(TemplateResponse):
    def __init__(self, *args, **kwargs):
        kwargs['mimetype'] = 'text/plain'
        return super(TextResponse, self).__init__(*args, **kwargs)

然后将其作为template_class传递给TemplateView

urlpatterns = patterns('django.views.generic.simple',
    (r'^robots\.txt$', TemplateView.as_view(template_name='robots.txt', response_class=TextResponse)),
)

答案 5 :(得分:1)

我知道这已经解决了1.5,但我正在使用的应用程序是1.4。

我使用sacabuche的答案连续两个网址模式出现问题:

url(r'^playlist1\.m3u$', ContentTypeTemplateView.as_view(template_name='playlist1.m3u', content_type='audio/x-mpegurl')),
url(r'^playlist2\.pls$', ContentTypeTemplateView.as_view(template_name='playlist2.pls', content_type='audio/x-scpls'))

我发现playlist1会返回正确的模板,但是有playlist2的内容类型! Playlist2还可以。添加内容类型为'foo'的第三个url模式会导致所有播放列表视图返回内容类型为'foo'。

我最终使用了渲染方法而取得了良好的效果:

网址:

url(r'^playlist1\.m3u$', 'content_type_to_template', {'template_name': 'playlist1.m3u', 'content_type': 'audio/x-mpegurl'}),
url(r'^playlist2\.pls$', 'content_type_to_template', {'template_name': 'playlist2.pls', 'content_type':'audio/x-scpls'})

的观点:

from django.shortcuts import render

def content_type_to_template(request, template_name='', content_type='text/plain'):
    return render(request, template_name, content_type=content_type)

答案 6 :(得分:0)

url(r'^test/(?P<template>.*)', lambda request, template: TemplateView.as_view(template_name=template)(request)),

答案 7 :(得分:0)

如何更改TemplateView的内容类型的简单示例:

#views.py
from django.views.generic import TemplateView

class HomeView(TemplateView):
    template_name = "home/index.html"
    content_type = 'text/html'

# urls.py
url(r'^home/$', HomeView.as_view(), name='home_page'),