How to assign currently logged in user as default value for a model field?
If you want to achieve this within the admin interface, you can use the save_model method. See below an example:
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()
No, you can't do it this way. Django (and Python) has pretty much zero global values, and that's a Good Thing(tm). Normally you get the current user in the view(request)
with request.user
. You can then pass that as a param to various methods/functions, but trying to set a global user
will only lead to tears in a multi-threaded environment.
There should be a bumper sticker that says, Globals are Evil. This will give you a good idea about my Number One problem with PHP.
SOLVED: I will use an example, but the important part is the funciton on the views.py. User is automatically available by django. Note the 'autor' model field has a ForeignKey to the 'User'. In the 'def form_valid' below I assign the currently logged in user as the default value.
If this is your model:
class ProspectoAccion(models.Model):
"""
Model representing a comment against a blog post.
"""
descripcion = models.TextField(max_length=1000)
autor = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
accion_date = models.DateTimeField(auto_now_add=True)
prospecto= models.ForeignKey(Prospecto, on_delete=models.CASCADE)
tipo_accion = models.ForeignKey('Accion', on_delete=models.SET_NULL, null=True)
And you have a class based view, do the following:
class ProspectoAccionCreate(LoginRequiredMixin, CreateView):
"""
Form for adding una acción. Requires login (despues poner)
"""
model = ProspectoAccion
fields = ['tipo_accion','descripcion',]
def form_valid(self, form):
#Add logged-in user as autor of comment THIS IS THE KEY TO THE SOLUTION
form.instance.autor = self.request.user
# Call super-class form validation behaviour
return super(ProspectoAccionCreate, self).form_valid(form)
HERE IS AN EXAMPLE FROM THE DOCUMENTATION: https://docs.djangoproject.com/en/2.0/topics/class-based-views/generic-editing/#models-and-request-user