Django Rest Framework序列化器分别渲染表单 [英] Django Rest Framework serializers render form individually

查看:133
本文介绍了Django Rest Framework序列化器分别渲染表单的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我知道如何整体呈现序列化器的形式,但我不知道如何像在模板之类的django形式那样单独呈现序列化器。

I know how to render the form of serializers as a whole but I do not know how to render it individually similar to django forms on a template like

{{ form.name }}
{{ form.name.errors }}

我当前的文件和代码如下:

My current files and codes are the following:

models.py

# Create your models here.
from django.db import models
from pygments.lexers import get_all_lexers
from pygments.styles import get_all_styles

LEXERS = [item for item in get_all_lexers() if item[1]]
LANGUAGE_CHOICES = sorted([(item[1][0], item[0]) for item in LEXERS])
STYLE_CHOICES = sorted((item, item) for item in get_all_styles())


class Snippet(models.Model):
    created = models.DateTimeField(auto_now_add=True)
    title = models.CharField(max_length=100, blank=True, default='')
    code = models.TextField()
    linenos = models.BooleanField(default=False)
    language = models.CharField(choices=LANGUAGE_CHOICES, default='python', max_length=100)
    style = models.CharField(choices=STYLE_CHOICES, default='friendly', max_length=100)

    class Meta:
        ordering = ('created',)

serializers.py

from rest_framework import serializers
from snippets.models import Snippet, LANGUAGE_CHOICES, STYLE_CHOICES


class SnippetSerializer(serializers.ModelSerializer):
    class Meta:
        model = Snippet
        fields = ('id', 'title', 'code', 'linenos', 'language', 'style')

form.html

{% extends 'main/base.html' %}
{% load rest_framework %}

{% block content %}
    <div class="container">
        <form method="POST" id="id-login-form" class="panel-body">
            {% csrf_token %}
            {% render_form serializer %}
            <!-- {% render_form serializer template_pack='rest_framework/horizontal' %}
            {% render_form serializer template_pack='rest_framework/vertical' %} -->
            <!-- {{ serializer }} -->

            <input type="submit" value="Save">
        </form>
    </div>
{% endblock %}


推荐答案

DRF提供除了 {%render_form%} 之外的另一个模板标记,实际上是在前者中使用以呈现所有

DRF provides another template tag, in addition to {% render_form %} called {% render_field %} that's actually used within the former to render all the fields.

所以您的 views.py 看起来像这样(您需要发送这种样式 dict在您的响应中):

So your views.py would look something like this (you need to send this style dict in your response):

class SnippetCreate(APIView):
    renderer_classes = [TemplateHTMLRenderer]
    template_name = 'snippets/snippet_create.html'
    style = {'template_pack': 'rest_framework/vertical/'}

    def get(self, request):
        serializer = SnippetSerializer()
        return Response({'serializer': serializer, 'style': self.style})

    def post(self, request):
        serializer = SnippetSerializer(data=request.data)
        return Response({'serializer': serializer, 'style': self.style})

然后您可以在模板中执行以下操作:

And in your template you could then just do:

{% render_field serializer.title style=style %}

{% render_field serializer.code style=style %}

了解发生情况的最佳方法实际上是查看源代码本身:
https://github.com/tomchristie/django-rest-framework/blob/master/rest_framework/templatetags/rest_framework.py#L35

Best way to understand what's going on is actually to look at the source itself: https://github.com/tomchristie/django-rest-framework/blob/master/rest_framework/templatetags/rest_framework.py#L35

然后调用

https://github.com/tomchristie/django-rest-framework/blob/master/rest_framework/rendere rs.py#L325

这篇关于Django Rest Framework序列化器分别渲染表单的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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