【发布时间】:2018-12-13 13:20:24
【问题描述】:
我正在尝试将一些对象从我的模型渲染到 HTML。我最初认为这会很简单(而且很可能是这样),但我遇到了许多错误。
在这个项目中,我构建了一些可以正常工作的 API 视图(HintsListApiView 和 HintsRudView 工作)。但理想情况下,我希望使用 API 生成一个常规的只读 HTML 页面,然后我可以按照自己的意愿设置样式 - 我的 HTMLAPIView。我正在尝试使用TemplateHTMLRenderer,但遇到了错误。我想要的只是让文本属性显示在 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',]
根 urls.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')),
]
urls.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' )
]
我遇到的错误多种多样,目前我在/api/hints/html/遇到AttributeError
Manager对象没有属性“值”。
我尝试过使用和不使用序列化程序(因为在文档中提到 TemplateHTMLRenderer 不需要序列化程序)。我认为问题在于view.py 和get_queryset 函数。我尝试了各种方法,但会遇到其他错误,例如
TypeError 上下文必须是 dict 而不是 QuerySet。
我们将不胜感激任何可以提供的帮助! 谢谢!
【问题讨论】:
-
您在
urls.py中错过了as_view的HTMLALIView方法:url(r'^html/', HTMLAPIView.as_view(), name='html' ) -
@neverwalkaloner 感谢您的帮助!添加 as_view() 后,我在 /api/hints/html/ 'Manager' object has no attribute 'value' 处收到 AttributeError
标签: python html django api django-rest-framework