如何修改Browsable API表单

时间:2013-07-05 11:08:36

标签: django django-rest-framework

目前,我正在创建一个UserRegistration视图,该视图应显示带有密码/确认密码字段的表单。问题是Browsable API只显示模型定义中出现的字段。

  • 我应该如何调整表单以便能够添加自定义字段?

    class UserRegistrationSerializer(serializers.ModelSerializer):
    
        password = serializers.CharField(
            max_length=128,
            widget=widgets.PasswordInput,
            label=_('Password')
        )
        password_confirm = serializers.CharField(
            max_length=128,
            widget=widgets.PasswordInput,
            label=_('Confirm password')
        )
    
        class Meta:
            model = User
            fields = ('id', 'name', 'username', 'email', 'password', 'registration_date')
    
        def validate(self, attrs):
            if attrs.get('password') and attrs.get('password_confirm'):
                if attrs['password'] != attrs['password_confirm']:
                    raise serializers.ValidationError(_("Passwords do not match"))
            return attrs
    
  • 此外,区分输入序列化器和输出序列化器的最佳方法是什么?

2 个答案:

答案 0 :(得分:0)

首先,您需要在您使用的ViewViewSet中对此进行定义。序列化程序不以这种方式控制可浏览的API,它只是处理从原生到某些序列化格式的对象并返回。

由于你没有提及,我猜你正在使用http://django-rest-framework.org/

您可能希望查看的文档的具体部分是:http://django-rest-framework.org/api-guide/viewsets.html#modelviewset

答案 1 :(得分:0)

Django Rest Framework实际上使用渲染到Browsable API视图中的普通Django Forms。

您可以通过修改使用的渲染器来控制表单的外观:http://www.django-rest-framework.org/api-guide/renderers#browsableapirenderer

例如:

class MyBrowsableAPIRenderer(BrowsableAPIRenderer):
    # either
    def get_context(self, *args, **kwargs):
        context = super(MyBrowsableAPIRenderer, self).get_context(*args, **kwargs)
        context["post_form"] = django.form.Form()  # modify form here          

    # or
    def get_rendered_html_form(self, view, method, request):
        # do things here to create full Form

@renderer_classes((JSONRenderer, MyBrowsableAPIRenderer)):
    class MyViewSet(GenericViewSet):
        pass

我不知道你是否可以在创建一个Form后修改它,我还没试过。如果没有,您可以重写创建表单的整个函数。我可以添加表单字段,这是更可取的。