How to auto insert the current user when creating an object in django admin?

前端 未结 5 2071
别跟我提以往
别跟我提以往 2020-12-08 01:08

I have a database of articles with a

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

Where User is imported as follows: <

相关标签:
5条回答
  • 2020-12-08 01:21

    Let's say that user B saves a record created by user A. By using this approach above the record will be saved with user B. In some scenarios this might not be the best choice, because each user who saves that record will be "stealing" it. There's a workaround to this, that will save the user only once (the one who creates it):

    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()
    
    0 讨论(0)
  • 2020-12-08 01:22

    As per http://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.prepopulated_fields you can't use ForeignKey with the prepopulated_field admin directive, alas

    But this thread might help you. In my answer I also link to a Google-scanned version of Pro Django, which has a great solution for this kind of thing. Ideally, am sure it's better if you can buy the book, but Google seems to have most of the relevant chapter anyway.

    0 讨论(0)
  • 2020-12-08 01:33

    Just in case anyone is looking for an answer, here is the solution i've found here: http://demongin.org/blog/806/

    To summarize: He had an Essay table as follows:

    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)
    

    where multiuser can create essays, so he created a admin.ModelAdmin class as follows:

    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 讨论(0)
  • 2020-12-08 01:34

    It's time for a better solution override get_form method

    lets say way have this model

    models.py

    from django.db import models
    from django.contrib.auth.models import User
    
    
    class Post(models.Model):
        title = models.CharField(max_length=256)
        content = models.TextField()
        author = models.ForeignKey(User, on_delete=models.CASCADE)
    
    
        def __str__(self):
            return self.title
    

    admin.py

    class PostAdmin(admin.ModelAdmin):
        # you should prevent author field to be manipulated 
        readonly_fields = ['author']
    
        def get_form(self, request, obj=None, **kwargs):
            # here insert/fill the current user name or id from request
            Post.author = request.user
            return super().get_form(request, obj, **kwargs)
    
    
        def save_model(self, request, obj, form, change):
            obj.author = request.user
            obj.author_id = request.user.id
            obj.last_modified_by = request.user
            obj.save()
    

    admin.site.register(Post, PostAdmin)

    0 讨论(0)
  • 2020-12-08 01:42

    If you don't want to keep foreignkey in you model to user, then in your admin.py override save method

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

    This will store the username who is logged in your db.

    0 讨论(0)
提交回复
热议问题