В модели Django ModelAdmin мне нужно отображать формы, настроенные в соответствии с разрешениями пользователя. Есть ли способ получить текущий объект пользователя в класс формы, чтобы я мог настроить форму в своем методе __init__
?
Я думаю, что сохранение текущего запроса в потоке локально было бы возможно, но это было бы моим последним средством, я думаю, что это плохой подход к дизайну.Django: Как получить текущего пользователя в админ-формах
ответ
Вот что я сделал недавно для блога:
class BlogPostAdmin(admin.ModelAdmin):
form = BlogPostForm
def get_form(self, request, **kwargs):
form = super(BlogPostAdmin, self).get_form(request, **kwargs)
form.current_user = request.user
return form
теперь я могу получить доступ к текущему пользователю в моем forms.ModelForm
путем доступа self.current_user
EDIT: Это старый ответ, и, глядя на него в последнее время я понял, что метод get_form
должен быть изменен, чтобы быть:
def get_form(self, request, *args, **kwargs):
form = super(BlogPostAdmin, self).get_form(request, *args, **kwargs)
form.current_user = request.user
return form
(Примечание: *args
)
Я думаю, что нашел решение, которое работает для меня: для создания ModelForm
Django использует администратор formfield_for_db_field
-метод как обратный вызов.
Так я перезаписаны этот метод в моем администратора и передать текущий объект пользователя в качестве атрибута с каждого поля (что, вероятно, не самый эффективный, но кажется чище меня, чем с помощью threadlocals:
def formfield_for_dbfield(self, db_field, **kwargs):
field = super(MyAdmin, self).formfield_for_dbfield(db_field, **kwargs)
field.user = kwargs.get('request', None).user
return field
Теперь я могу доступ к текущему объекту пользователя в формах __init__
что-то вроде:
current_user=self.fields['fieldname'].user
Ответ Joshmaker для меня не работает на Django 1.7. Вот то, что я должен был сделать для Django 1.7:
class BlogPostAdmin(admin.ModelAdmin):
form = BlogPostForm
def get_form(self, request, obj=None, **kwargs):
form = super(BlogPostAdmin, self).get_form(request, obj, **kwargs)
form.current_user = request.user
return form
Для получения более подробной информации об этом методе см this relevant Django documentation
гений, я застрял в этой задаче очень трудно – bobleujr
наткнулся на одно и то же, и это был первый результат Google на мой page.Dint помог, немного больше googling и работал !!
Вот как это работает для меня (Джанго 1.7+):
class SomeAdmin(admin.ModelAdmin):
# This is important to have because this provides the
# "request" object to "clean" method
def get_form(self, request, obj=None, **kwargs):
form = super(SomeAdmin, self).get_form(request, obj=obj, **kwargs)
form.request = request
return form
class SomeAdminForm(forms.ModelForm):
class Meta(object):
model = SomeModel
fields = ["A", "B"]
def clean(self):
cleaned_data = super(SomeAdminForm, self).clean()
logged_in_email = self.request.user.email #voila
if logged_in_email in ['[email protected]']:
raise ValidationError("Please behave, you are not authorised.....Thank you!!")
return cleaned_data
миленькая обходной, :) –
спасибо дружище! :) – NoobEditor
Другим способом вы можете решить эту проблему заключается в использовании Django каррирование который немного чище, чем просто прикрепление объект запроса к форме модель.
from django.utils.functional import curry
class BlogPostAdmin(admin.ModelAdmin):
form = BlogPostForm
def get_form(self, request, **kwargs):
form = super(BlogPostAdmin, self).get_form(request, **kwargs)
return curry(form, current_user=request.user)
Это имеет дополнительное преимущество, что делает ваш инициализации метода на форме немного более ясно, как другие поймут, что это передается как kwarg, а не просто случайным образом прикреплен атрибут объекта класса до инициализации.
class BlogPostForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
self.current_user = kwargs.pop('current_user')
super(BlogPostForm, self).__init__(*args, **kwargs)
Этот случай использования документирована в ModelAdmin.get_form
[...], Если вы хотите предложить дополнительные поля суперпользователям, можно поменять на другой базовой форме, как так:
class MyModelAdmin(admin.ModelAdmin):
def get_form(self, request, obj=None, **kwargs):
if request.user.is_superuser:
kwargs['form'] = MySuperuserForm
return super().get_form(request, obj, **kwargs)
Если вам просто нужно, чтобы сохранить поле, то вы могли бы просто переопределить ModelAdmin.save_model
from django.contrib import admin
class ArticleAdmin(admin.ModelAdmin):
def save_model(self, request, obj, form, change):
obj.user = request.user
super().save_model(request, obj, form, change)
- 1. Django: как получить идентификатор группы текущего пользователя
- 2. Получить текущего пользователя в Django Внешний шаблон
- 3. Получить текущего пользователя в django-filter Метод
- 4. Получить текущего пользователя в Django admin
- 5. Django: Получить текущего пользователя в модели save
- 6. Как получить текущего пользователя в теге шаблона?
- 7. django получение текущего идентификатора пользователя
- 8. Как получить пользователя текущего процесса
- 9. Как получить текущего пользователя Принцип
- 10. Как получить AD текущего пользователя
- 11. Django. Python. Как получить журнал активности текущего пользователя?
- 12. Как получить текущего пользователя из пакета веб-сокетов Django?
- 13. Получить имя текущего пользователя
- 14. Получить текущего пользователя в Passport.js
- 15. Получить текущего пользователя в TagHelper
- 16. Получить текущего пользователя в моделях
- 17. Django: Как написать имя текущего пользователя из каждого представления (django)
- 18. Сохраните текущего пользователя в поле модели django
- 19. Как получить текущего пользователя Windows в asp.net?
- 20. Как получить текущего пользователя в ядре asp.net
- 21. Как получить имя текущего пользователя в smack
- 22. как получить текущего пользователя окна в ФОС
- 23. Как получить текущего пользователя в приложении MVC?
- 24. Как получить изображение текущего пользователя в Sharepoint?
- 25. Как получить текущего пользователя PAM в pam_ldap?
- 26. Как получить текущего пользователя в ASP.NET MVC
- 27. Как получить имя текущего пользователя в delphi?
- 28. Как получить текущего пользователя в ListView?
- 29. Как получить текущего пользователя в пользовательском маршруте?
- 30. Laravel - Как получить текущего пользователя в AppServiceProvider
Это 'AttributeError':' kwargs.get ('запрос', None) .user' – hcalves