使用django rest框架呈现表单';s ModelViewSet类嵌入APIView

使用django rest框架呈现表单';s ModelViewSet类嵌入APIView,django,django-rest-framework,Django,Django Rest Framework,我想使用rest框架为我的django模型创建锅炉板表单 文档显示它使用APIView: 但是我想使用ModelViewSet来避免定义自定义操作方法 这可能吗?你能举个例子吗 这是我试过的。我的模型: class Person(AbstractUser): pass 我的序列化程序: class PersonSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = Perso

我想使用rest框架为我的django模型创建锅炉板表单

文档显示它使用APIView:

但是我想使用ModelViewSet来避免定义自定义操作方法

这可能吗?你能举个例子吗

这是我试过的。我的模型:

class Person(AbstractUser):
    pass
我的序列化程序:

class PersonSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Person
        fields = ('first_name', 'last_name', 'email', 'groups')
我的看法是:

class PersonViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows persons to be viewed or edited.
    """
    queryset = Person.objects.all().order_by('-date_joined')
    serializer_class = PersonSerializer
    renderer_classes = [TemplateHTMLRenderer]
    template_name = 'common/rest_create.html'
这是我的网址:

url(r'person_create_api/$', PersonViewSet.as_view({'get': 'create'}), name='person-create-api'),
我得到的错误是:

IntegrityError at /school/person_create_api/
duplicate key value violates unique constraint "school_person_username_key"
DETAIL:  Key (username)=() already exists.
当我将
username
字段添加到序列化程序字段时,我得到:

HTTP/1.0 400 Bad Request
Date: Tue, 20 Sep 2016 17:00:22 GMT
Server: WSGIServer/0.2 CPython/3.5.1+
X-Frame-Options: SAMEORIGIN
Vary: Cookie
Allow: GET, HEAD, OPTIONS
Content-Type: text/html; charset=utf-8

我正在使用django 1.9和最新的DRF 3.4.6。

首先,让DRF为您创建url(这可以防止错误配置url):

以下是生成的URL:

^persons/$ [name='person-list']
^persons\.(?P<format>[a-z0-9]+)/?$ [name='person-list']
^persons/blank_form/$ [name='person-blank-form']
^persons/blank_form\.(?P<format>[a-z0-9]+)/?$ [name='person-blank-form']
^persons/(?P<pk>[^/.]+)/$ [name='person-detail']
^persons/(?P<pk>[^/.]+)\.(?P<format>[a-z0-9]+)/?$ [name='person-detail']
请注意,TemplateHtmlRenderer是在方法级别设置的,而不是在类中全局设置的,以便允许它对其他方法/视图使用其他适当的呈现器。从DRF站点的教程中作弊,
serializer=PersonSerializer()
这用于生成未绑定表单

以下是模板:

{% load rest_framework %}

<html><body>    
<h1>New Person</h1>

<form action="{% url 'school:person-create' %}" method="POST">
    {% csrf_token %}
    {% render_form serializer %}
    <input type="submit" value="Save">
</form>

</body></html>
{%load rest\u framework%}
新人
{%csrf_令牌%}
{%render_form serializer%}

您期望从ModelViewSet获得的其他视图正常工作

一旦这样做成功,我将获取该视图的内容并在其他视图中使用它。所以它确实继承自APIView。您使用的是什么版本的DRF和Django?您将get定义为一个
视图
,而不是在您创建的modelviewset上重写/重载它,这可能不会以您期望的方式执行。您也没有使用路由器,这是为DRF路由API端点的传统方式。它们甚至在文档()中展示了如何创建自定义的。我也不知道你的
Person
的序列化程序或模型是什么样子的。你能把它包括进去吗?tredzko I添加了模型和序列化程序。我需要查看自定义路由器。尝试将“用户名”添加到“PersonSerializer”上的字段列表中,看看这是否有帮助(您必须在创建时指定它)。完整性错误看起来像是由于试图将一个空白用户名(因为它未在序列化程序上公开)分配给多个id,而用户名被限制为唯一。请记住,您是在告诉“get”(默认行为是查看,而不是发布)尝试“创建”一个人,因此它可能无法获取任何值,并且可能因此出错。因此,这种方法包括向类中添加方法并编写模板。我仍然很好奇如何使用开箱即用的功能来实现它。
class PersonViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows persons to be viewed or edited.
    """
    queryset = Person.objects.all().order_by('-date_joined')
    serializer_class = PersonSerializer
    template_name = 'common/rest_create.html'

    @list_route(renderer_classes=[renderers.TemplateHTMLRenderer])
    def blank_form(self, request, *args, **kwargs):
        serializer = PersonSerializer()
        return Response({'serializer': serializer})
{% load rest_framework %}

<html><body>    
<h1>New Person</h1>

<form action="{% url 'school:person-create' %}" method="POST">
    {% csrf_token %}
    {% render_form serializer %}
    <input type="submit" value="Save">
</form>

</body></html>