使用Django Rest框架的ModelViewSet类APIView渲染表单 [英] Rendering a form with django rest framework's ModelViewSet class insead of APIView

查看:103
本文介绍了使用Django Rest框架的ModelViewSet类APIView渲染表单的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想使用其余框架为django模型创建样板表格。

I want to create boiler-plate forms for my django models using the rest framework.

文档使用API​​View进行显示: http://www.django-rest-framework.org/topics/html-and-forms/#rendering-forms

Documentation shows it using the APIView: http://www.django-rest-framework.org/topics/html-and-forms/#rendering-forms.

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

But I want to use the ModelViewSet in order to avoid defining custom action methods.

这可能吗?你可以分享一个例子吗?

Is this possible? Can you share an example?

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

Here is what I tried. My model:

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 字段添加到序列化程序字段,我得到:

When I add the username field to the serializer fields, I get:

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。

I am using django 1.9 and latest DRF 3.4.6.

推荐答案

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

First thing first, let the DRF create the url's for you (this prevents misconfiguring the urls):

from rest_framework.routers import DefaultRouter
router = DefaultRouter()
router.register(r'snippets', PersonViewSet)

urlpatterns = [
    ...
    url(r'^', include(router.urls)),
]

以下是生成的网址:

^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']

模型为与上面相同,这里是视图:

Model is same as above, and here is the view:

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})

注意,TemplateHtmlRenderer设置为方法级别在类中是全局的,以便让它在其他方法/视图中使用其他适当的渲染器。在DRF网站上欺骗本教程, serializer = PersonSerializer()用于生成

Note, the TemplateHtmlRenderer is set at the method level instead of globally in the class so to let it use other appropriate renderers for other methods/views. Cheating off the tutorial at DRF site, serializer = PersonSerializer() this is used for generating an unbound form.

这是模板:

{% 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>

您希望ModelViewSet中的其他视图照常工作。

Other views that you expect from a ModelViewSet work as usual.

这篇关于使用Django Rest框架的ModelViewSet类APIView渲染表单的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆