gamer
gamer

Reputation: 5863

Django admin model field set to current user

I have a model with field:

class MyModel(models.Model):
    name = models.CharField(max_length=50)
    created_by = models.ForeignKeyField(User)

In my admin:

class MyModelAdmin(admin.ModelAdmin):
    list_display= ("name",)
    fields = ("name",)

Here I don't want created_by in admin while adding MyModel. I want it to be set to current user like created_by = request.user

How can I do this?

Thank you

Upvotes: 2

Views: 3169

Answers (2)

Rahul Gupta
Rahul Gupta

Reputation: 47846

To do that override the save_model method and set the created_by field to the current user.

class MyModelAdmin(admin.ModelAdmin):
    list_display= ("name",)
    fields = ("name",)

    def save_model(self, request, obj, form, change):             
        if not change: 
        # can use this condition also to set 'created_by'    
        # if not getattr(obj, 'created_by', None):            
            obj.created_by = request.user
        obj.save()

Upvotes: 0

Alasdair
Alasdair

Reputation: 308879

You have already set fields so that created_by does not appear in form in the Django admin.

Now you need to override save_model, and set the user before saving new objects.

class MyModelAdmin(admin.ModelAdmin):
    fields = ("name",)

    def save_model(self, request, obj, form, change):
        if not change:
            # the object is being created, so set the user
            obj.created_by = request.user
        obj.save()

Upvotes: 7

Related Questions