在Django管理网站中自动填充created_by字段

29 投票
4 回答
28033 浏览
提问于 2025-04-15 11:33

我想在一个非常简单的网页应用中使用Django的管理界面,但遇到了一个不应该太难解决的问题。

考虑以下情况:

class Contact(models.Model):
    name = models.CharField(max_length=250, blank=False)
    created_by = models.ForeignKey(User, blank=False)

我找不到一种方法来自动填充“创建者”这个字段,并让Django的管理界面知道这个信息。我看到的大多数方法都涉及到重写对象的保存方法,并把请求的用户传进去。这些方法都需要你自己构建视图和/或表单。

理想情况下,在管理网站中创建新联系人的表单应该不显示“创建者”这个字段(这比较简单),并且应该自动填充当前用户的信息(这似乎比想象中要复杂)。

4 个回答

2

我通过重写 Django 管理后台的 save_model 方法来实现这个功能。因为你提到想使用 Django 的管理界面,所以我觉得我的方法最合适。具体步骤如下:

  1. 首先,在管理后台注册 Contact 模型,并排除 'created_by' 字段。
@admin.register(Contact)
class Notice(admin.ModelAdmin):
    list_display = ('name', 'created_by')
    exclude = ('created_by', )
  1. 然后在同一个类 Notice 中重写 save_model 方法。
def save_model(self, request, obj, form, change,):
    obj.created_by = request.user

    super().save_model(request, obj, form, change)
4

你需要为这个字段指定一个默认值,在这个情况下,就是调用一个方法来获取当前用户(可以查看认证文档来了解如何获取当前用户)。

33

http://code.djangoproject.com/wiki/CookBookNewformsAdminAndUser

这段话的意思是,你需要在你的ModelAdmin对象上实现保存的方法。

撰写回答