Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 如何修改可浏览的API表单_Django_Django Rest Framework - Fatal编程技术网

Django 如何修改可浏览的API表单

Django 如何修改可浏览的API表单,django,django-rest-framework,Django,Django Rest Framework,目前,我正在创建一个UserRegistration视图,它应该显示带有密码/确认密码字段的表单。问题是可浏览的API只显示模型定义中出现的字段 我应该如何调整表单以便能够添加自定义字段 class UserRegistrationSerializer(serializers.ModelSerializer): password = serializers.CharField( max_length=128, widget=widgets.Passwo

目前,我正在创建一个UserRegistration视图,它应该显示带有密码/确认密码字段的表单。问题是可浏览的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
    
  • 另外,区分输入序列化程序和输出序列化程序的最佳方法是什么


首先,您需要在您正在使用的
视图
视图集
中定义它。序列化程序不以这种方式控制可浏览的API,它只处理将对象从本机格式转换为某种序列化格式并返回

既然你没提,我猜你在用


您可能想查看的文档的具体部分是:

Django Rest框架实际上使用了正常的Django表单,这些表单被呈现到可浏览的API视图中

可以通过修改所使用的渲染器来控制窗体的外观:

例如:

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
我不知道你是否可以在表单创建后修改它,我还没有尝试过。如果没有,您可以重写创建表单的整个函数。如果您可以添加表单字段,那就更好了