访问自定义django小部件中的当前用户

时间:2013-03-29 17:03:01

标签: python django

我有一个自定义窗口小部件,用于将ForeignKey字段的下拉列表替换为带有radiobuttons的图像列表。在我的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子类中的当前用户?

1 个答案:

答案 0 :(得分:0)

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

我有2个模型:NewsImageImage包含名称字段和ImageFieldNews模型包含指向图像的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我有一个自定义小部件类:

class SelectForeign(widgets.Widget):     current_user =无

def __init__(self, attrs=None, choices=(), user = None):
    self.current_user = None
    super(SelectForegin, self).__init__(attrs, choices)

就是这样,现在我的小部件包含当前登录的用户。它不是很漂亮,但它确实有用。

注意: 这将替换ForeignKey模型中的所有News字段。要解决此问题,应该使用自定义ForeignKey子类,以便我们只能覆盖它。

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