2010-06-07 17 views
18

que tienen una base de datos de artículos con un¿Cómo insertar automáticamente el usuario actual al crear un objeto en django admin?

submitter = models.ForeignKey(User, editable=False) 

Cuando se importa User de la siguiente manera:

from django.contrib.auth.models import User. 

me gustaría inserción automática el usuario activa actual en el campo remitente cuando un usuario en particular presenta el artículo.

¿Alguien tiene alguna sugerencia?

+0

¿Quieres decir para el uso en administrador o front-end? –

+0

Me gustaría utilizar en el sitio de administración de django – FurtiveFelon

Respuesta

30

Por si acaso alguien está buscando una respuesta, aquí está la solución que he encontrado aquí: http://demongin.org/blog/806/

En resumen: Tenía una mesa de Ensayo de la siguiente manera:

from django.contrib.auth.models import User 

class Essay(models.Model): 
    title = models.CharField(max_length=666) 
    body = models.TextField() 
    author = models.ForeignKey(User, null=True, blank=True) 

donde multiusuario puede crear ensayos, por lo que creó una clase admin.ModelAdmin de la siguiente manera:

from myapplication.essay.models import Essay 
from django.contrib import admin 

class EssayAdmin(admin.ModelAdmin): 
    list_display = ('title', 'author') 
    fieldsets = [ 
     (None, { 'fields': [('title','body')] }), 
    ] 

    def save_model(self, request, obj, form, change): 
     if getattr(obj, 'author', None) is None: 
      obj.author = request.user 
     obj.save() 
+0

Esto solo funciona si el autor tiene nulo = Verdadero. Sin él obtengo "raise self.field.rel.to.DoesNotExist" de la línea "getattr". ¿Puedo requerir null = False? – dfrankow

+0

@dfrankow, no estoy seguro si ya descubrió esto, pero si elimina la línea 'if getattr', puede hacer esto con una columna' null = False'. – Andy

+0

Me funcionó a la perfección. Muchas gracias. –

0

Según http://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.prepopulated_fields no se puede utilizar ForeignKey con la directiva de administración prepopulated_field, por desgracia

Pero this thread podría ayudarle. En mi respuesta, también conecto con una versión escaneada de Google de Pro Django, que tiene una gran solución para este tipo de cosas. Idealmente, estoy seguro de que es mejor si puedes comprar el libro, pero Google parece tener la mayor parte del capítulo relevante de todos modos.

+1

No puedo ver realmente las páginas relevantes ... – FurtiveFelon

2

Si no desea mantener ForeignKey en que el modelo de usuario, a continuación, en su anulación admin.py método para guardar las

obj.author = request.user.username 
obj.save() 

Esto almacenará el nombre de usuario que ha iniciado sesión en su base de datos.

0

Digamos que el usuario B guarda un registro creado por el usuario A. Al usar este enfoque anterior, el registro se guardará con el usuario B. En algunos casos, esta podría no ser la mejor opción, ya que cada usuario que guarde ese registro estar "robando". Hay una solución a este, que salvará al usuario una sola vez (el que lo crea):

models.py

from django.contrib.auth.models import User 

class Car(models.Model): 
    created_by = models.ForeignKey(User,editable=False,null=True,blank=True) 
    car_name = models.CharField(max_length=40) 

admin.py

from . models import * 

class CarAdmin(admin.ModelAdmin): 
    list_display = ('car_name','created_by') 
    actions = None 

    def save_model(self, request, obj, form, change): 
     if not obj.created_by: 
      obj.created_by = request.user 
     obj.save() 
Cuestiones relacionadas