为了账号安全,请及时绑定邮箱和手机立即绑定

在 Django Rest Framework 和 UI 之间共享表单逻辑

在 Django Rest Framework 和 UI 之间共享表单逻辑

呼唤远方 2021-06-18 18:53:12
我的 Django 应用程序有一个 entity Campaign。对于我的 UI,我已经实现CampaignForm了具有重要逻辑的逻辑。我还集成了 Django Rest Framework,以允许Campaign通过 API实现类的CRUD 功能。在 Google 和 DRF 的文档上搜索后,我发现没有将 Django Forms 集成到 DRF 的官方方法。我一定是误会了吧?我唯一看到的是 DRF 有自定义验证器,但我认为它不能将我的表单的所有逻辑移植到 DRF 的验证器。如何将我的 CampaignForm 的逻辑包含到我的 API 中?参考:class CampaignForm(forms.ModelForm):    class Meta:        model = Campaign        fields = '__all__'        help_texts = {            'dayparting_schedule': schedule_help_text        }    def __init__(self, *args, **kwargs):        self.request = kwargs.pop('request', None)        super().__init__(*args, **kwargs)    def clean(self, *args, **kwargs):        """        - All Active MUST have dayparting schedule defined        - If schedule is set then timezone must also be set        """        cleaned_data = super().clean()        status = cleaned_data.get('status')        dayparting_schedule = cleaned_data.get('dayparting_schedule')        if status == Campaign.ACTIVE:            # if there is no existing dayparting_schedule OR            # if this form does not have dayparting_schedule            if dayparting_schedule is None \                    and self.instance.dayparting_schedule is None:                raise forms.ValidationError(_('dayparting_schedule cannot be empty for Active'))        schedule_present = bool(dayparting_schedule)        timezone_present = bool(cleaned_data.get('dayparting_timezone'))        # XOR: 0^0, 1^1 => 0, otherwise 1        if schedule_present ^ timezone_present:            raise forms.ValidationError(                _('dayparting_schedule and dayparting_timezone must be set together.'))        return cleaned_data    def clean_dayparting_schedule(self, *args, **kwargs):        schedule = self.cleaned_data.get('dayparting_schedule')        if not schedule:            return        self.validate_schedule(schedule)        return schedule    def validate_schedule(self, yaml_s):        dic = yaml.load(yaml_s)
查看完整描述

2 回答

?
郎朗坤

TA贡献1921条经验 获得超9个赞

简而言之: Django rest 框架具有serializers模块,它相当于 Django 的forms.

您应该创建Serializer(或ModelSerializer),它将以与在您的CampaignForm.

看看序列化器 | Django Rest 框架文档


查看完整回答
反对 回复 2021-06-22
  • 2 回答
  • 0 关注
  • 134 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号