2009-01-31 18 views
11

Quiero construir un sitio django donde un determinado grupo de usuarios de confianza pueda editar su información de perfil. ¿Tiene sentido hacer que cada usuario de confianza pase por la interfaz de administración de django? Solo quisiera que puedan ver y editar su propia información (obviamente). No parece como esto se ajusta a la forma en que las personas definen django "confianza", especialmente el bit en negrita ...Caso de uso válido para django admin?

De The Django Book, Chapter 18:

El administrador está diseñado para ser utilizado por personas que se , el desarrollador, confianza. Esto no solo significa que "personas que han sido autenticadas;" significa que Django supone que se puede confiar en que sus editores de contenido hagan lo correcto .

Esto significa que no hay “aprobación” proceso para la edición de contenidos - si confianza a los usuarios, nadie tiene que aprobar de sus ediciones. También significa que el sistema de permisos, mientras que potente, no tiene soporte para limitar el acceso por objeto. Si confía en que alguien edite sus propias historias , usted confía en que no edite de otra persona sin permiso.

Es éste uno de esos casos de uso que se ajusta con el módulo de administración de Django, o es sólo una vista especializado para un usuario que no es de confianza?

Respuesta

17

No, el administrador de Django no es adecuado para perfiles de usuario individuales, cada usuario podría ver y editar todos los demás perfiles de usuario. Esto es más adecuado para un administrador que tiene que administrar todos los usuarios a la vez.

Lo que necesita para compilar es una página de perfil de usuario. Django ya tiene un buen sistema de inicio de sesión cortesía del módulo django.contrib.auth. Puede integrar esto fácilmente en sus páginas, y es exactamente lo que el administrador de Django usa para autenticar usuarios.

A continuación, tendrá que crear una página simple que exponga la información del perfil de ese usuario específico en función de su modelo de Usuario. Esto debería ser relativamente sencillo ya que solo requerirá una vista y una plantilla, y la plantilla puede aprovechar ModelForms.

+2

Es posible restringir el administrador, por lo que solo puede editar su propio perfil; pero no lo recomendaría para este caso de uso. +1 –

3

No consideraría la edición de mi perfil personal en un sitio web una tarea administrativa. Creo que django-profiles es lo que estás buscando.

3

El modelo de autorización de Django es un tanto simplista. Solo se trata de verificar el permiso del Modelo en su conjunto.

Para este tipo de cosas, se verá forzado a escribir sus propias funciones de vista que manejan la comprobación adicional.

Después de haber escrito uno o dos, verá el patrón. Entonces puede pensar en escribir su propio decorador para manejar esto.

def profileView(request, object_id): 
    p= Profile.objects.get(id=int(object_id)) 
    if request.session['user'] != p.get_user(): 
     # respond with a 401 not authorized or a helpful message 
    # process normally, since the session['user'] is the user for the Profile. 

Por lo anterior para trabajar, tendrá que activar las sesiones, y asegúrese de registrar el usuario en la sesión al iniciar la sesión con éxito. También necesitarás erradicar la sesión cuando cierren la sesión.

+0

Escribir sus propios puntos de vista es una opción, y a menudo una buena opción. Pero no estás "obligado" a hacerlo. Las clases ModelAdmin de Django tienen ganchos de método (como "has_change_permission") que le permiten modificar el comportamiento del administrador de maneras bastante importantes. –

+0

@Carl Meyer: has_x_permission es para todo el modelo. También debe validar la propiedad de cada objeto, que no forma parte de los decoradores estándar. Fácil de agregar, pero sigue siendo una extensión. –

5

Le sugiero que cree un modelo de persona que contenga OneToOneField para el modelo de usuario (modelo de usuario de sitio de administración). Algunos lo como esto ..

from django.contrib.auth.models import User 

    class Person(models.Model): 
     """The person class FKs to the User class and contains additional user information 
     including userImage, country, etc""" 

     user = models.OneToOneField(User, related_name='person_fk') 
     url = models.URLField(max_length=255, blank=True) 
     country = models.CharField(max_length=2, blank=True) 
     state = models.CharField(max_length=50, blank=True) 
     zipCode = models.IntegerField(max_length=7, blank=True, null=True) 
     userImage = models.ImageField(upload_to=generate_filename, blank=True, null=True) 
1

Sólo como referencia, he aquí una snippet que demuestra cómo se puede lograr con bastante facilidad este efecto (solo los usuarios pueden editar sus propios objetos "") en la administración de Django. Advertencia: No recomendaría hacer esto para los perfiles de los usuarios, será más fácil y más flexible crear su propia vista de edición con un ModelForm.

1

Hay algunas aplicaciones enchufables django que permiten permisos a nivel de fila en su modelo de administrador. Sin embargo, estaría más inclinado a escribir mi propia vista que permita a los usuarios hacerlo desde dentro de la aplicación.

Tenía aspiraciones similares (usando la contribución de administrador) al diseñar la aplicación en la que estoy trabajando actualmente, pero decidí que la aplicación de administración es realmente para uso de administrador, y que los usuarios regulares deberían tener sus propias páginas para hacer trabajo y personalización (si es necesario).

Puede generar fácilmente las vistas CRUD para un modelo en particular utilizando vistas genéricas y formas de modelo, y simplemente aplique hojas de estilo para un aspecto uniforme con el resto de su aplicación.