我想做以下事情:
用我的模特
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 %}
这可能吗?谢谢
答案 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>