使用覆盖保存为抽象模型扩展 Django ModelForm
Posted
技术标签:
【中文标题】使用覆盖保存为抽象模型扩展 Django ModelForm【英文标题】:Extending Django ModelForm for Abstract Model with Overriden Save 【发布时间】:2012-11-26 19:47:03 【问题描述】:所以我有这个类,它是一堆其他类的抽象父类,我们称之为 ActivityModel(代表某种最新活动/或对该对象所做的更改),我想重写 save 方法以采取每次保存对象时都会使用另一个参数,因此我将其定义如下。
class ActivityModel(models.Model):
last_updated = models.DateTimeField(auto_now=True)
updater = models.ForeignKey(UserProfile)
change = models.CharField(max_length=255)
def save(self, updater, change, *args, **kwargs):
self.updater = updater
self.change = change
super(ActivityModel, self).save(*args, **kwargs)
class Meta:
abstract = True
但是现在我继承这个类的所有模型都不能使用 ModelForms,因为我已经更改了保存方法以要求第二个字段(与经过身份验证的用户相对应的 UserProfile,每次保存时都必须提供)所以我想知道是否可以对 ModelForm 类进行子类化以覆盖它的 save 方法,以便它调用新的 ParentModel.save 方法并填写已提供给它的当前登录用户。我想我可以只在表单 init 上提供 UserProfile,但我遇到的一个大问题是是否可以将 ModelForm 类子类化并像 ParentModelForm 类一样创建,然后可以为 ParentModel 的每个子类创建子类。这可能吗?如果可以,我将如何去做?
非常感谢所有帮助!感谢您的宝贵时间!
【问题讨论】:
您能说得更具体些吗?我不明白你的问题。也许如果你给我们你真正的父类和一些子类,我们可以给你一个答案。我认为您正在尝试强制进行不应该存在的继承,但我无法根据您提供给我们的数据来弄清楚.... 我试图用一个更相关的例子来澄清它。这有帮助吗? 好的。而不是做这样的事情:an_activity.save(updater, change)
你为什么不这样做:1)an_activity.updater = updater
2)an_activity.change = change
3)an_activity.save()
也许,你应该问的第一个问题是:你为什么要改变保存方法?
是的,我昨晚确实意识到了这一点。谢谢你的建议!
【参考方案1】:
ModelForm 也是一个 python 类,其行为与其他类相似。
#Inherits from ModelForm class
class ParentModelForm(forms.ModelForm):
...
...
def save(self, *args, **kwargs):
...
...
#Inherits from ParentModelForm
class ChildModelForm(ParentModelForm):
..
..
#You would have to override the Meta class
class Meta:
model = Child
def save(self, *args, **kwargs):
#Calling the parent model form save method
super(ChildModelForm, self).save(*args, **kwargs)
【讨论】:
以上是关于使用覆盖保存为抽象模型扩展 Django ModelForm的主要内容,如果未能解决你的问题,请参考以下文章
保存自定义用户模型时 Django ManyToMany 覆盖
将 Django 模型中的保存方法覆盖为使用 celery 异步的最佳实践