Настройка Mimetype при использовании TemplateView в Django - PullRequest
29 голосов
/ 29 июля 2011

Кто-нибудь знает, как мне установить желаемый mimetype при использовании TemplateView, например:

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

В этом случае я хочу установить mimtype как "text / plain"

Ответы [ 8 ]

40 голосов
/ 29 июля 2011

Для Джанго> = 1,5

TemplateView принимает аргумент content_type.

Пример копирования из @ Meilo

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

Для Джанго <1,5 </h1> Я думаю, что просто вызвать 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' ....

19 голосов
/ 03 марта 2013

В Django 1.5 аргумент content_type в TemplateView добавляет те же функциональные возможности, которые были в представлении на основе функций ранее.Это облегчает установку желаемого mimetype:

urlpatterns = patterns('',
    url(r'^test\.txt$', TemplateView.as_view(template_name='staticpages/test.html', content_type='text/plain')),
4 голосов
/ 08 ноября 2013

Я знаю, что вы просите установить тип контента с TemplateView, но я дам вам другой ответ, который, я думаю, будет более чистым и может использоваться в версиях Django ниже 1.5.

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

При таком подходе вам не нужно ничего импортировать или подкласс TemplateView и делать некрасивые перезаписи некоторых методов. Вы можете просто использовать старую технику с функциональными представлениями.

1 голос
/ 20 июля 2013

Я знаю, что это решено для 1.5, но приложение, в котором я работаю, - 1.4.

У меня была проблема с двумя шаблонами URL-адресов подряд, используя ответ 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 был в порядке.Добавление шаблона 3-го URL-адреса с типом содержимого «foo» приведет к тому, что все представления списка воспроизведения будут возвращены с типом содержимого «foo».

В итоге вместо этого я использовал метод рендеринга с хорошими результатами:

URL:

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)
1 голос
/ 23 июля 2012

Если вы не хотите расширять 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)),
)
1 голос
/ 27 июня 2012

Лучший способ сделать это - создать подкласс 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)
0 голосов
/ 11 мая 2018

Простой пример того, как изменить тип содержимого 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'),
0 голосов
/ 25 июня 2014
url(r'^test/(?P<template>.*)', lambda request, template: TemplateView.as_view(template_name=template)(request)),
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...