Django通用UpdateView: 获取要更新的对象

0 投票
1 回答
2405 浏览
提问于 2025-04-17 22:59

我其实在用 django.views.generic.edit.UpdateView 来更新某个模型的特定字段。因为我没有传递要更新的对象的主键或别名,所以我只是重写了 get_object 方法:

def get_object(self, queryset=None):
    return Model.objects.get(user__id=self.request.user.id)

如果在 get_object 中找不到对象,我会收到一个 '查询不匹配[...]' 的错误,这没问题。但是如果出现异常,我希望能把用户重定向到其他地方,而不是显示异常信息。不幸的是,get_object 方法不允许重定向,因为 Django 期望它返回一个对象。

有没有什么优雅的方法可以检查请求的对象是否存在,如果不存在就重定向用户?我也想避免重写 dispatch 方法来在那儿检查对象是否存在。这样会导致多一次不必要的数据库查询。所以对于一个简单的更新视图,我会有三次查询。

任何建议都非常好 :)

1 个回答

1

你可以在你的 get_object 方法里执行 get 操作,让一个叫做 DoesNotExist 的错误继续传播(也就是说,不要去捕捉这个错误),然后重写 dispatch 方法,在那里捕捉这个 DoesNotExist 异常。然后从 dispatch 方法里,你可以返回一个重定向。

大概是这样的:

def dispatch(...):
    try:
         return super(...)  # call superclass dispatch
    except Model.DoesNotExist:
         return ... your redirection ...

撰写回答