1

我有一个自定义小部件,用于将ForeignKey字段的下拉列表替换为带有单选按钮的图像列表。在我的render方法中,我需要访问当前用户(当前登录的用户),就像我在普通视图中使用request.user.

我已经阅读了很多解决方案来做到这一点Forms,你应该从**kwargs你的__init__方法中弹出用户对象。

**kwargs但是小部件在他们的__init__方法中没有:

def __init__(self, attrs=None):
    if attrs is not None:
        self.attrs = attrs.copy()
    else:
        self.attrs = {}

如何访问Widget子类中的当前用户?

4

1 回答 1

1

我通过阅读 Django 源找到了一个解决方案:formfield_overrides在自定义管理员中设置时传递用户对象。

我有 2 个模型:NewsImage. 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子类,这样我们就可以只覆盖那个子类。

如果有人有更好的更清洁的解决方案,请分享,我会接受。

于 2013-03-29T17:37:30.297 回答