Python Django TemplateHTMLRenderer-呈现HTML视图

Python Django TemplateHTMLRenderer-呈现HTML视图,python,html,django,api,django-rest-framework,Python,Html,Django,Api,Django Rest Framework,我正在尝试将一些对象从模型渲染为HTML。我最初认为这将是直接的(很可能是),但我遇到了许多错误 在这个项目中,我构建了一些运行良好的API视图(HintsListApiView和HintsRudViewwork)。但理想情况下,我希望使用API生成一个常规的只读HTML页面,然后我可以根据自己的意愿对其进行样式设置—myHTMLAPIView。我试图使用模板htmlrenderer,但遇到了错误。我只想让文本属性在HTML中显示出来。实际的文本只是一个句子长。 这些是我的文件: models.

我正在尝试将一些对象从模型渲染为HTML。我最初认为这将是直接的(很可能是),但我遇到了许多错误

在这个项目中,我构建了一些运行良好的API视图(
HintsListApiView
HintsRudView
work)。但理想情况下,我希望使用API生成一个常规的只读HTML页面,然后我可以根据自己的意愿对其进行样式设置—my
HTMLAPIView
。我试图使用
模板htmlrenderer
,但遇到了错误。我只想让文本属性在HTML中显示出来。实际的文本只是一个句子长。 这些是我的文件:

models.py:

from django.db import models
from rest_framework.reverse import reverse as api_reverse

class Hints(models.Model):

    text = models.TextField(max_length=255)
    author = models.CharField(max_length=20)
    timestamp = models.DateTimeField(auto_now_add=True)


    def __str__(self):
        return str(self.text)

    def timestamp_pretty(self):
        return self.timestamp.strftime('%b %d %Y')

    def get_api_url(self, request=None):
        return api_reverse("api-hints1:hints-rud", kwargs={'pk': self.pk}, request=request)
views.py:

class HTMLAPIView(generics.RetrieveAPIView):
    lookup_field = 'pk'
    serializer_class = HTMLSerializer
    renderer_classes = (TemplateHTMLRenderer,)

    def get_queryset(self):
        queryset = Hints.objects.value('text')
        return Response({'queryset': queryset}, template_name='base.html') 



class HintsListApiView(mixins.CreateModelMixin, generics.ListAPIView):

    lookup_field = 'pk'
    serializer_class = HintsSerializer

    def get_queryset(self):
        qs = Hints.objects.all()
        query = self.request.GET.get("q")
        if query is not None:
            qs = qs.filter(
                Q(text__icontains=query)|
                Q(author__icontains=query)
                ).distinct()
        return qs

    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)

    def get_serializer_context(self, *args, **kwargs):
        return {"request": self.request}



class HintsRudView(generics.RetrieveUpdateDestroyAPIView):

    lookup_field = 'pk'
    serializer_class = HintsSerializer

    def get_queryset(self):
        return Hints.objects.all()

    def get_serializer_context(self, *args, **kwargs):
        return {"request": self.request}
serializers.py:

class HintsSerializer(serializers.ModelSerializer):
    url = serializers.SerializerMethodField(read_only=True)

    class Meta:
        model = Hints
        fields = [
            'url',
            'id', 
            'text', 
            'author', 
            'timestamp_pretty'
            ]

        read_only_fields = ['timestamp_pretty', 'id']

    def get_url(self, obj):
        request = self.context.get("request")
        return obj.get_api_url(request=request)


class HTMLSerializer(serializers.ModelSerializer):

    class Meta:
        model = Hints
        fields = [ 
        'text', 
        ]

        read_only_fields = ['text',]
根URL.py:

from django.contrib import admin
from django.conf.urls import url, include
from rest_framework import routers, serializers, viewsets

urlpatterns = [
    url('admin/', admin.site.urls),
    url(r'^api/hints/', include(('hints1.api.urls', 'api'), namespace='api-hints1')),
    url(r'^api-auth/', include('rest_framework.urls')),
]
URL.py:

from .views import HintsRudView, HintsListApiView, HTMLAPIView
from . import views
from django.contrib import admin
from django.conf.urls import url, include
from rest_framework import routers, serializers, viewsets

urlpatterns = [
    url(r'^(?P<pk>\d+)$', HintsRudView.as_view(), name='hints-rud'),
    url(r'^$', HintsListApiView.as_view(), name='hints-list'),
    url(r'^html/', HTMLAPIView.as_view(), name='html' )    
]
from.views导入HintsRudView、HintsListApiView、htmlapiew
从…起导入视图
从django.contrib导入管理
从django.conf.url导入url,包括
从rest_框架导入路由器、序列化程序、视图集
URL模式=[
url(r'^(?P\d+$”,HintsRudView.as_view(),name='hints-rud'),
url(r'^$',HintsListApiView.as_view(),name='hits-list'),
url(r'^html/',HTMLAPIView.as_view(),name='html')
]
我遇到的错误多种多样,目前我在
/api/hits/html/

Manager
对象没有属性“value”

我尝试过使用和不使用序列化程序(因为在文档中提到
TemplateHTMLRenderer
不需要序列化程序)。我认为问题在于
view.py
get\u queryset
函数。我尝试过各种方法,但会出现其他错误,如

TypeError上下文必须是dict而不是QuerySet

任何可以提供的帮助都将不胜感激!
谢谢

所以我想做什么就做什么。但老实说,我不完全确定它为什么起作用,所以如果有人能提供澄清,请澄清

我将views.py中的HTMLAPIView更改为视图集:

class HTMLAPIView(viewsets.ViewSet):
    renderer_classes = [TemplateHTMLRenderer]
    template_name = 'base.html'
    serializer_class = HTMLSerializer


    def list(self, request):
        queryset = Hints.objects.order_by('pk')        
        return Response({'queryset': queryset}) 
然后,我的urls.py中出现了一个错误,但通过在
.as\u view()

我不确定这是否有效的原因是,它根据我的需要从模型中返回我的
text
属性,但我看不出我在哪里指定了正确的属性。只是因为它是第一个吗


我还试着对序列化程序进行注释,但它仍然运行良好,因此我得出结论,这不是产生结果的原因

您错过了
url.py
HTMLALIView
as_view
方法:
url(r'^html/',HTMLAPIView.as_view(),name='html')
@neverwalkinner感谢您的帮助!添加as_view()后,我在/api/hints/html/“Manager”对象上收到一个AttributeError,它没有属性“value”
url(r'^html/', HTMLAPIView.as_view({'get': 'list'}), name='html' )