2013-03-29 33 views
0

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

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

但是部件并不在他们的__init__方法**kwargs

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

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

回答

0

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

我有2个机型:NewsImageImage包含一个名称字段和一个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我有一个自定义窗口小部件类

然后:

class SelectForeign(小工具。小工具): current_user =无

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

就是这样,现在我的小部件包含当前登录的用户。这不是很漂亮,但它的工作原理。

注: 这取代了News模型内的所有ForeignKey领域。为了解决这个问题,应该使用一个自定义ForeignKey子类,以便我们可以仅覆盖该子类。

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

相关问题