2010-03-10 22 views
11

me gustaría hacer algo como esto:¿Cómo asignar usuario actualmente conectado como valor predeterminado para un campo de modelo?

class Task(models.Model): 
    ... 
    created_by = models.ForeignKey(User, **default=[LoggedInUser]** blank=True, null=True, related_name='created_by') 

Es esto posible? No pude encontrar la forma correcta de obtener el usuario conectado, aparte de request.user, en una vista, que no parece funcionar aquí.

PS_ Me doy cuenta de que podría inicializar los datos del modelo por otros medios, pero creo que esta es la manera más limpia.

+0

Disculpe la sintaxis resaltada, pero quería destacar el valor predeterminado. – Nacho

Respuesta

4

No, no puede hacerlo de esta manera. Django (y Python) tiene valores globales cero cero, y eso es una buena cosa (tm). Normalmente obtiene el usuario actual en el view(request) con request.user. A continuación, puede pasar eso como un parámetro a varios métodos/funciones, pero tratar de establecer un user global solo provocará desgarros en un entorno de subprocesos múltiples.

Debe haber una pegatina para el parachoques que diga, Globals are Evil. Esto le dará una buena idea sobre mi problema número uno con PHP.

+0

Bastante justo. Veré si puedo hacer que funcione con señales, lo que creo que puede ser la mejor manera de hacerlo. Gracias – Nacho

23

Si desea lograr esto en la interfaz de administración, puede usar el método save_model. Ver más abajo un ejemplo:

class List(models.Model): 
    title = models.CharField(max_length=64) 
    author = models.ForeignKey(User) 

class ListAdmin(admin.ModelAdmin): 
    fields = ('title',) 
    def save_model(self, request, obj, form, change): 
     obj.author = request.user 
     obj.save() 
0

Si el uso ModelForm, lo siguiente será llenar un valor predeterminado para un campo especial. como por ejemplo, el propietario presentada es una Charfield para el nombre de usuario

def fillview(request): 
    instance = YourModel(owner=request.user.username) 
    form = YourModelForm(instance=instance) 

    if request.method == 'POST': 
     form = YourModelForm(request.POST, request.FILES) 
     if form.is_valid(): 
      pass 
      return render(request, 'success.html') 

    return render(request, 'fill.html', {'form': form}) 

vez iniciada la sesión, se podía ver dueño presentado es el nombre del usuario actual.

+1

Ver también el argumento 'initial' para Django Forms. Explicado en [esta respuesta] (http://stackoverflow.com/a/604325/310441). – Owen

+0

@Owen esto es más concisa, ¡gracias por compartir esto! – WeizhongTu

Cuestiones relacionadas