如何在django admin中创建对象时自动插入当前用户?

时间:2010-06-07 16:40:04

标签: python django django-admin

我有一个带

的文章数据库
submitter = models.ForeignKey(User, editable=False)

导入User的地方如下:

from django.contrib.auth.models import User. 

我想在特定用户提交文章时自动将当前活动用户插入提交者字段。

有人有任何建议吗?

5 个答案:

答案 0 :(得分:38)

万一有人在寻找答案,这里是我在这里找到的解决方案: http://demongin.org/blog/806/

总结一下: 他的论文表格如下:

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)

多用户可以创建论文,所以他创建了一个admin.ModelAdmin类,如下所示:

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()

答案 1 :(得分:2)

如果您不想将模型中的外键保留给用户,请使用admin.py覆盖保存方法

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

这将存储登录数据库的用户名。

答案 2 :(得分:2)

假设用户B保存了用户A创建的记录。通过使用上述方法,记录将与用户B一起保存。在某些情况下,这可能不是最佳选择,因为保存该记录的每个用户都将是“偷”它。有一个解决方法,只会保存用户一次(创建它的人):

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()

答案 3 :(得分:0)

根据http://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.prepopulated_fields,您不能将ForeignKey与prepopulated_field管理员指令一起使用,唉

this thread可能对您有所帮助。在我的回答中,我还链接到谷歌扫描版本的Pro Django,它有一个很好的解决方案。理想情况下,如果你可以购买这本书,我相信它会更好,但谷歌似乎还是拥有大部分相关章节。

答案 4 :(得分:0)

现在该是一个更好的解决方案覆盖 get_form 方法

的时候了

让我们说说这个模型

models.py

host

admin.py

dig

admin.site.register(Post,PostAdmin)