我想使用其余框架为我的django模型创建样板表单。
文档使用APIView显示它:http://www.django-rest-framework.org/topics/html-and-forms/#rendering-forms。
但我想使用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。
答案 0 :(得分:2)
首先,让DRF为您创建网址(这可以防止错误配置网址):
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']
模型与上面相同,这里是视图:
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()
这用于生成未绑定的表单。
这是模板:
{% 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中获得的其他视图照常工作。