专栏首页JackeyGao的博客Django小技巧15: 使用基于类视图的Mixins

Django小技巧15: 使用基于类视图的Mixins

Django小技巧15: 使用基于类视图的Mixins

Posted November 05, 2018

翻译整理自: simpleisbetterthancomplex.com

今天讲述三点关于 Mixins 使用的一些规范:

  • Django 提供的View 保持在继承的最右边.
  • Mixins 在基本视图的左侧
  • Mixins 应该继承Python的内置对象类型(object).

下面举例说明规则

Python

class FormMessageMixin(object):
    @property
    def form_valid_message(self):
        return NotImplemented

    form_invalid_message = 'Please correct the errors below.'

    def form_valid(self, form):
        messages.success(self.request, self.form_valid_message)
        return super(FormMessageMixin, self).form_valid(form)

    def form_invalid(self, form):
        messages.error(self.request, self.form_invalid_message)
        return super(FormMessageMixin, self).form_invalid(form)


class DocumentCreateView(FormMessageMixin, CreateView):
    model = Document
    fields = ('name', 'file')
    success_url = reverse_lazy('documents')
    form_valid_message = 'The document was successfully created!'

依类似的方式, 你可以在UpdateView中, 重用相同的FormMessageMixin, 并覆盖默认的form_invalid_message方法.

Python

class DocumentUpdateView(FormMessageMixin, UpdateView):
    model = Document
    fields = ('name', )
    success_url = reverse_lazy('documents')
    form_valid_message = 'The document was successfully updated!'
    form_invalid_message = 'There are some errors in the form below.'

Django 1.9开始, 内置的LoginRequiredMixin和UserPassesTestMixin. 如果你要在视图中使用它们, 它们始终位于最左侧:

Python

Mixins在左,View在后

class DocumentUpdateView(LoginRequiredMixin, FormMessageMixin, UpdateView):
    model = Document
    fields = ('name', )
    success_url = reverse_lazy('documents')
    form_valid_message = 'The document was successfully updated!'

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Django小技巧09: 创建修改密码视图

    就此而言, 使用函数式视图更容易实现。 因为PasswordChangeForm不从ModelForm继承。并且其构造函数使用user参数.

    用户1416054
  • Django小技巧07: 在模板中获取当前URL

    确保项目配置里的context_processors包含django.template.context_processors.request.

    用户1416054
  • 用户Python3解析超大的csv文件

    我在日前获得一个任务,为了做分析, 从一个超大的csv文件中解析email地址和对应的日期时间戳然后插入到数据库中. 我知道有其他工具可以方便的完成我的工作(比...

    用户1416054
  • Django 解决上传文件时,request.FILES为空的问题

    用html的form上传文件时,request.FILES为空,没有收到上传来的文件,但是在request.POST里找到了上传的文件名(只是一个字符串)。

    砸漏
  • flask 一个页面多个提交按钮(flask 23)

    class NewPostForm(FlaskForm): title = StringField('Title', validators=[DataRequ...

    用户5760343
  • Django学习之八:forms组件【对

        Handle (掌控)一个form是非常复杂的工程,需要做很多功能:不同的类型的数据要有不同的渲染;校验数据;获取检验后的干净数据,并将数据反序列化为相...

    py3study
  • vue 页面逻辑复用

    在开发表单页面时, 经常碰到一种情况。 同一表单存在 新建 编辑 查看 几种状态。页面的大体组成基本相同,但又需要做部分针对当前状态的处理,处理这类问题,一般存...

    copy_left
  • Flask(表单验证 八)

    zx钟
  • Django上传文件时,request.FILES为空的问题

    用html的form上传文件时,request.FILES为空,没有收到上传来的文件,但是在request.POST里找到了上传的文件名(只是一个字符串)。

    kirin
  • React Native 最快捷的开发框架分享

    工具人

扫码关注云+社区

领取腾讯云代金券