Pregunta

Me gustaría crear un subconjunto de Usuarios que no tengan un inicio de sesión ... básicamente como una forma de agregar un campo de fotógrafo a las fotos sin tener una cuenta completa asociada con esa persona (ya que en muchos casos, en realidad nunca iniciarán sesión en el sitio). Una advertencia es que también me gustaría poder habilitar una cuenta para ellos más adelante.

Entonces, creo que la pregunta es cuál es la mejor manera de configurar un " Gente " tabla que se vincula con la tabla de usuario sin extender realmente la tabla de usuario con el perfil de usuario.

¿Fue útil?

Solución

A perfil de usuario (según lo devuelto por django.contrib.auth.models.User.get_profile ) no extiende la tabla de Usuario: el modelo que especifique como modelo de perfil con la configuración de AUTH_PROFILE_MODULE es solo un modelo que tiene un ForeignKey a User . get_profile y la configuración son realmente solo una API conveniente para acceder a una instancia de un modelo específico que tiene un ForeignKey a una instancia específica de User .

Como tal, una opción es crear un modelo de perfil en el que ForeignKey a User pueda ser null y asociar su El modelo de foto con este modelo de perfil en lugar del modelo User . Esto le permitiría crear un perfil para un usuario inexistente y adjuntar un usuario registrado al perfil en una fecha posterior.

Otros consejos

¿Usuarios que no pueden iniciar sesión? Solo les he dado una contraseña totalmente aleatoria.

import random
user.set_password( str(random.random()) )

Nunca podrán iniciar sesión.

Proporcione su propia rutina de autenticación, luego puede verificar (o no) todo lo que quiera. Hacemos esto por lo que si fallan en un nombre de usuario normal, también podemos dejarlos en el correo electrónico / contraseña (aunque eso no es lo que estoy mostrando a continuación).

en settings.py:

AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.ModelBackend',
    'userprofile.my_authenticate.MyLoginBackend', # if they fail the normal test
 )

en userprofile / my_authenticate.py:

from django.contrib.auth.backends import ModelBackend
from django.contrib.auth.models import User

class MyLoginBackend(ModelBackend):
    """Return User record if username + (some test) is valid.
       Return None if no match.
    """

    def authenticate(self, username=None, password=None, request=None):
        try:
            user = User.objects.get(username=username)
            # plus any other test of User/UserProfile, etc.
            return user # indicates success
        except User.DoesNotExist:
            return None
    # authenticate
# class MyLoginBackend

De la documentación en django auth , si desea usar el modelo de usuario, es obligatorio tener un nombre de usuario y contraseña, no hay " cuentas anónimas " Supongo que podría crear cuentas con una contraseña predeterminada y luego dar la oportunidad a las personas de habilitar un " real " cuenta (estableciendo una contraseña ellos mismos).

Para configurar un " Personas " tabla que se vincula con la tabla de usuario, solo tiene que usar un campo ForeignKey (que en realidad es el forma recomendada de agregar información adicional al modelo del usuario, y no a la herencia)

Utilizando un modelo con un ForeignKey Es posible que el campo que vincula al Usuario no funcione como desea porque necesita acceso anónimo. No estoy seguro de si eso va a funcionar, pero puede intentar lo que sucede si deja que tenga una ForeignKey para AnonymousUser (¡cuyo id siempre es Ninguno!) en su lugar.

Si lo intentas, publica tus resultados aquí, tendría curiosidad.

El django.contrib.auth.models.User existe únicamente con el fin de utilizar el backend de autenticación predeterminado (basado en la base de datos). Si escribe su propio backend, puede hacer que algunas cuentas no tengan contraseña, manteniendo las cuentas normales con contraseñas. La documentación de Django tiene un capítulo sobre esto .

Otro upvote para respuesta de la insin : manéjelo a través de un Perfil de usuario . James Bennett tiene una gran artículo sobre la extensión de django.contrib.auth.models.User . Camina a través de un par de métodos, explica sus pros / contras y aterriza en la forma UserProfile como ideal.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top