我们说我有以下型号:
class Post(model):
...
class BlogPost(Post):
...
class OtherPost(Post):
...
假设我的url架构编辑帖子类似于
/site/post/\d+/edit
换句话说,我没有单独的网址路径来编辑OtherPosts
与BlogPost
。
使用UpdateView
时,我需要设置模型 - 当然,实际模型是Post
的子类。
class Update(generics.UpdateView):
model = Post
Djangoey / DRY处理这个问题的方法是什么?
目前,查看UpdateView
代码,看起来我可以保留Update.model
未定义,并覆盖get_queryset
,这需要返回具有正确子模型的查询。我还需要覆盖get_form
以返回正确的表单。
答案 0 :(得分:0)
看起来以下方法正常工作,这似乎相当小。
class Update(generic.edit.UpdateView):
model = Post
def get_form_class(self):
try:
if self.object.blogpost:
return BlogPostForm
except Post.DoesNotExist:
pass
try:
if self.object.otherpost:
return OtherPostForm
except Post.DoesNotExist:
pass
def get_object(self, queryset=None):
object = super(Update, self).get_object(queryset)
try:
return object.blogpost
except Post.DoesNotExist:
pass
try:
return object.otherpost
except Post.DoesNotExist:
pass
或者,如果使用像InheritanceManager这样的多态混合,那么就像这样:
class Update(generic.edit.UpdateView):
model = Post
form_class = {
BlogPost: BlogPostForm,
OtherPost: OtherPostForm,
}
def get_form_class(self):
return self.form_class[self.object.__class__]
def get_queryset(self):
return self.model.objects.select_subclasses()