我有一个尚未上线的django应用程序,我刚收到使用API的请求,我最终选择了DRF。但我真的失去了一些组件。我能够登录,获取令牌并传递令牌来获取某些东西。它现在将在前端使用angular.as,它需要全部为JSON。
虽然我会重写视图,但我希望尽可能多地重用视图模块。例如。我有一个验证,验证表格的注册(它使用三种不同的观点,因为成员可以通过三种不同的方式注册,并适用一些条件,即自我注册,公司注册和公司代理注册)。
def validate_member(data,editing=False,directregistration=True):
#data is passsed from forms.py. Return any error message and the cleaned data to the calling forms.py
return [errmsg,data]
forms.py clean方法示例:
class NewMemberForm(forms.Form):
firstName=forms.CharField(max_length=25,required=True,widget=forms.TextInput())
def clean(self):
self.cleaned_data=super(NewMemberForm,self).clean()
validate_member_form=validate_member(self.cleaned_data,directregistration=True)
#do we have error messages now?
if len(validate_member_form[0])>0: #yes we have error messages
raise forms.ValidationError(_(validate_member_form[0]),code='invalid')
return validate_member_form[1]
和我的views.py:
if request.method=='POST':
err_found=False
go_id=''
form=NewMemberForm(request.POST or None)
if form.is_valid():
#create user
pass
我看到forms.py在DRF APIView中没用(我至少没有得到一个例子)。如何在没有太多痛苦的情况下转换这样的应用程序?
答案 0 :(得分:0)
这就是事情 - 你不能(至少不容易)。 DRF程序员决定将serializers
实现为与django forms
完全不同的并行结构。事实上,他们甚至不分享任何祖先。你当然可以使用mixin在表单和序列化器中共享代码,但是再次有一些细微的差别,如forms
有clean
方法,而序列化程序有validate
个。
以下是可以采用的几种最小化代码重复的策略 -
瘦视图和胖模型 - 尝试将大多数业务逻辑保留在模型中(如果它们与模型相关),或者在单独的域类中。视图应该只是模型和模板之间的连接,并且不应包含业务或模型相关的逻辑。这样,您编写的代码可以在django的普通视图和DRF视图中重用。如果你想更进一步,尝试在模型级别封装全局验证和约束(即总是成立的验证),然后你可以编写某些序列化器混合,从模型中捕获验证错误并将其显示给用户。
面向服务的体系结构 - 尝试将所有内容编写为服务或REST API,并在普通视图中使用这些服务。我的公司有一些性能问题,所以我最终编写了一个自定义请求客户端(在django测试客户端的行上),它实际上并没有向api发出http请求,但仍然提供了足够的抽象。这种方法起初可能看起来很有利可图,但从长远来看,它会产生非常混乱的代码。事实上,如果你愿意达到这样的程度,我建议采用下一种方法。
前端框架 - 如果您没有某些SEO限制,那么您当然可以转向基于JavaScript框架的前端架构。然后,您只需要编写DRF API,所有其他代码都应该由客户端框架处理。它还可以带来更好的用户体验。