目前,我正在创建一个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
此外,区分输入序列化器和输出序列化器的最佳方法是什么?
答案 0 :(得分:0)
首先,您需要在您使用的View
或ViewSet
中对此进行定义。序列化程序不以这种方式控制可浏览的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后修改它,我还没试过。如果没有,您可以重写创建表单的整个函数。我可以添加表单字段,这是更可取的。