渲染表单ViewSet Django Rest框架

时间:2016-12-15 18:17:36

标签: django forms django-rest-framework rendering

我想做以下事情:

用我的模特

class User(models.Model):
   id = models.AutoField(primary_key=True)
   field1 = models.CharField(max_length=100)
   fk1 = models.ForeignKey(Group)
goes on

在此之后,我创建了我的Serializer,它看起来像:

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = UserSerializer
        fields = (...)

    ...

最后,我创建了我的ViewSet,它应该如下所示:

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer

但现在,我如何能够创建一个viewSet,例如,用我的类生成一个表单?我的最终想法是能够做到这样的事情:

def my_view(request):
   my_form = UserViewSet.as_view({'get': 'list'}(request))
   # from here either to be able to use .render().content
   # or, inside the template, render with {% render_form my_form %}

这可能吗?谢谢

2 个答案:

答案 0 :(得分:2)

你建议的是可能的,但它通常没有意义。 Django Rest Framework非常适合创建API,以便您可以以该Ji格式发送和接收来自该API的信息。

获取表单涉及从服务器获取呈现的HTML。这对Django本身来说是一个更好的任务。您可以使用CreateView执行您尝试执行的操作:

def UserCreateView(CreateView):
    model = User
    form_class = "name_of_your_form.html"  # Or you could call the form 'user_create_form.html` and leave this line out.
    fields = [...]

根据文档

,您的表单将在您的模板中提供
<form action="" method="post">{% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Save" />
</form>

答案 1 :(得分:2)

正如文档所说:

  

可以使用render_form模板标记将序列化程序呈现为表单,并将序列化程序实例作为模板的上下文包括在内。

下一个例子可能适合你。但@YPCrumble如何说DRF的目标是轻松快速地构建API,而不是渲染表单

class UserDetail(APIView):
    renderer_classes = [TemplateHTMLRenderer]
    template_name = 'your_template.html'

    def get(self, request, pk):
        serializer = UserSerializer(profile)
        return Response({'serializer': serializer})

    def post(self, request, pk):
        user = get_object_or_404(User, pk=pk)
        serializer = UserSerializer(data=request.data)
        if not serializer.is_valid():
            return Response({'serializer': serializer})
        serializer.save()
        return redirect('some_url_name')  

模板文件:

{% load rest_framework %}
<html><body>

   <form action="{% url 'user_url' pk=user.pk %}" method="POST">
        {% csrf_token %}
        {% render_form serializer %}
        <input type="submit" value="Save">
    </form>

</body></html>

`DRF Docs link