2013-03-29 2 views
0

У меня есть собственный виджет, используемый для замены выпадающего меню для 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 суб-класса?

ответ

0

Я нашел решение, прочитав через источник 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): Текущий_пользователь = Отсутствует

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

И все, теперь мой виджет содержит текущего пользователя. Это не очень, но это работает.

Примечание: Это заменяет все ForeignKey поля внутри News модели. Чтобы исправить это, должен существовать собственный подклассу ForeignKey, чтобы мы могли переопределить только этот класс.

Если у кого есть лучшее решение, которое чище, пожалуйста, поделитесь и я принимаю.

Смежные вопросы