在Django中使用TemplateView时设置Mimetype

Rod*_*ogo 30 django django-templates

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

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

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

sac*_*che 41

对于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')),
Run Code Online (Sandbox Code Playgroud)

对于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)
Run Code Online (Sandbox Code Playgroud)

你可以看看:

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'),
)
Run Code Online (Sandbox Code Playgroud)

使用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'
    ....
Run Code Online (Sandbox Code Playgroud)


Mei*_*ilo 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')),
Run Code Online (Sandbox Code Playgroud)