我通过阅读 Django 源找到了一个解决方案:formfield_overrides
在自定义管理员中设置时传递用户对象。
我有 2 个模型:News
和Image
. Image
包含一个名称字段和一个ImageField
. 该News
模型包含一个ForeignKey
指向图像的内容:
class News(models.Model):
... bunch of news related fields
image = models.ForeignKey(Image)
然后在我的admin.py
我有一个自定义的新闻管理类:
class NewsAdmin(admin.ModelAdmin):
model = News
def get_form(self, request, obj=None, **kwargs):
self.formfield_overrides = {
models.ForeignKey : {'widget' : SelectForeign(user = request.user)}
}
return super(NewsAdmin, self).get_form(request, obj, **kwargs)
然后在我的widget.py
我有一个自定义小部件类:
类 SelectForeign(widgets.Widget): current_user = None
def __init__(self, attrs=None, choices=(), user = None):
self.current_user = None
super(SelectForegin, self).__init__(attrs, choices)
就是这样,现在我的小部件包含当前登录的用户。这不是很漂亮,但它有效。
注意:
这将替换模型ForeignKey
内的所有字段News
。为了解决这个问题,应该使用一个自定义ForeignKey
子类,这样我们就可以只覆盖那个子类。
如果有人有更好的更清洁的解决方案,请分享,我会接受。