问题
使用Django开发程序时,我们可以使用django自带的后台来管理注册的模型,非常的方便。
但方便的前提之下就是需要牺牲很多的灵活性,例如默认情况下模型的添加时是不做任何事情的,也就是除了不可编辑项之外,其他的项都是通过html表单来编辑的。这并不能满足我们某些情况下的复杂要求。
举个简单的例子,我们在编写博客程序时每篇文章都会有它的作者,这个字段我们是不希望让用户编辑的,而是直接让程序生成当前用户的值。
模型代码:1
2
3
4
5
6
7# models.py
class Blog(models.Model):
name = models.CharField(max_length=100)
body_text = models.TextField(null=True)
pub_date = models.DateField(auto_now_add=True)
mod_date = models.DateField(auto_now=True)
author = models.CharField(default='anonymous',max_length=128,editable=False)
上述代码中,author字段代表了这篇文章的作者,很显然这个字段的具体值不应该让编辑人员编辑。那我们怎么生成当前用户的数据赋值给该字段呢?
重写ModelAdmin
我们在注册admin时可以使用一个ModelAdmin的派生类来替换默认的原型数据admin.site.register(Blog)
。
这样我们需要编写一个ModelAdmin,而ModelAdmin提供了save_model
方法,查看源码发现默认的模型就是直接调用该方法来将数据保存到数据库:
1 | def save_model(self, request, obj, form, change): |
由上述源码我们可以发现其不仅有obj参数,而且还拥有request和change参数。这样我们就可以重写该方法来达到我们的目的。
1 | class BlogAdmin(admin.ModelAdmin): |
上述代码中小猪重写了save_model
方法,在调用模型的save方法之前先判断模型是否拥有id数据,依此来判断是创建过程还是编辑过程(或者直接使用change字段,该字段为boolean类型),如果是创建过程将当前登录用户的用户名赋值给模型的author字段。最后再调用save()方法,这样就算是完成我们的功能。
最后使用新的ModelAdmin替换默认模型!
1 | admin.site.register(Blog,BlogAdmin) |
Done!
结语
django这个框架的好处就在于他提供了很多基础的功能,而且这些功能都是可以通过一些方法来重写以达到不同项目不同的需求的。好比我们这个需求已经完成了,但是我们却可以想象到利用这个save_model()方法来完成我们很多个性化的功能,例如用户积分的判断等等等。。。。
参考: