En ModelAdmin de Django, necesito mostrar formularios personalizados según los permisos que tiene un usuario. ¿Hay alguna manera de obtener el objeto de usuario actual en la clase de formulario, para poder personalizar el formulario en su método __init__
?
Creo que guardar la solicitud actual en un hilo local sería una posibilidad, pero este sería mi último recurso, creo que estoy pensando que es un mal enfoque de diseño ....Django: Cómo obtener el usuario actual en formularios de administrador
Respuesta
Aquí es lo que hice recientemente para un Blog:
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
Ahora puede acceder el usuario actual en mi forms.ModelForm
accediendo self.current_user
EDIT: Esta es una respuesta de edad, y mirándolo Hace poco se dio cuenta el método get_form
debe modificarse para ser:
def get_form(self, request, *args, **kwargs):
form = super(BlogPostAdmin, self).get_form(request, *args, **kwargs)
form.current_user = request.user
return form
(Observe la adición de *args
)
Creo que encontré una solución que funciona para mí: Para crear un ModelForm
Django usa el método formfield_for_db_field
del administrador como una devolución de llamada.
Así que han sobrescrito este método en mi administrador y pasar el objeto de usuario actual como un atributo con cada campo (que probablemente no es el más eficiente, pero parece más limpio para mí que utilizan 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
Ahora puedo acceder al objeto usuario actual en las formas __init__
con algo como:
current_user=self.fields['fieldname'].user
La respuesta de Joshmaker no funciona para mí en Django 1.7. Aquí es lo que tenía que hacer para 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
Para más detalles sobre este método, por favor ver this relevant Django documentation
genio, me he quedado atrapado en este problema muy duro – bobleujr
topamos con lo mismo y este fue el primer resultado de Google en mi page.Dint ayudó, poco más Google y funcionó !!
Aquí es cómo funciona para mí (Django 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
poco agradable solución, gracias :) –
amigo! :) – NoobEditor
Otra manera de resolver este problema es mediante el uso de Django currificación que es un poco más limpio que acaba de fijar el objeto de la petición a la forma modelo.
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)
Esto tiene el beneficio adicional de hacer su init método en su forma un poco más claro como otros entenderá que está siendo pasado como kwarg y no sólo une al azar atributo a la clase de objeto antes de la inicialización.
class BlogPostForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
self.current_user = kwargs.pop('current_user')
super(BlogPostForm, self).__init__(*args, **kwargs)
Este caso de uso está documentado en ModelAdmin.get_form
[...] Si desea ofrecer campos adicionales a los superusuarios, usted podría intercambiar en forma de base diferente, así:
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)
Si sólo tiene que guardar un campo, entonces usted podría anular 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. Conjunto de formularios de Django usuario actual
- 2. obtener usuario actual en el formulario de Django
- 3. Django - Usuario, Perfil de usuario y Administrador
- 4. Inno Setup: ¿Cómo obtener el directorio de usuario actual cuando se ejecuta el instalador como administrador?
- 5. Reutilizando formularios de administrador para las vistas de usuario en django?
- 6. ¿Cómo obtener el GUID del usuario actual?
- 7. Extendiendo formulario de usuario nuevo, en el administrador Django
- 8. Sistema de autenticación de administrador/usuario independiente en Django
- 9. Obtener el nombre de usuario en la autenticación de formularios
- 10. Cómo obtener la aplicación actual en Django
- 11. Django - Sobreescribiendo get_form para personalizar formularios de administrador según solicitud
- 12. Valor predeterminado para el usuario ForeignKey con administrador de Django
- 13. Cómo obtener el usuario actual de Windows registrado en MSBuild
- 14. Cómo crear un usuario administrador en django tests.py
- 15. Para el administrador de django, ¿cómo agrego un campo al modelo de usuario y lo edito en el administrador?
- 16. obtener contexto de usuario actual
- 17. Actividad de registro en el administrador de Django - Django
- 18. ¿Cómo obtener el usuario actual en ASP.NET MVC
- 19. ¿Cómo puedo obtener el usuario actual en Liferay?
- 20. django: cómo acceder al usuario de solicitud actual en ModelForm?
- 21. obtener el rol del usuario actual
- 22. Obtener el directorio personal del usuario actual
- 23. ¿Puedo utilizar un usuario existente como administrador de Django al habilitar el administrador por primera vez?
- 24. ¿Cómo obtener el nombre de la url actual usando Django?
- 25. ¿Cómo se llama el widget utilizado para asignar permisos de usuario en el administrador de Django?
- 26. Formularios Django - ¿Cómo no validar?
- 27. ¿Cómo puedo obtener el directorio de usuario actual?
- 28. Cómo bloquear el usuario mediante autenticación de formularios
- 29. Django Administrador de encadenamiento
- 30. JavaScript - Cómo obtener el nombre del usuario actual
se trata de un 'AttributeError':' kwargs.get ('solicitud', Ninguna) .user' – hcalves