当前位置:首页 > 行业动态 > 正文

如何在Django Admin中实现添加数据时自动记录用户信息到表中?

### Django Admin添加数据自动记录user到表中的实现,,在 Django Admin中,通过重写 save_model方法可以实现添加数据时 自动记录当前用户到表中。在 Setting模型的 admin.py中注册 SettingAdmin类,并在其中重写 save_model方法,将 request.user赋值给模型实例的 user字段并保存。

在Django Admin中添加数据时,自动记录当前用户到表中的实现可以通过重写save_model方法来实现,这种方法允许我们在保存模型实例之前执行自定义逻辑,例如将当前用户记录到某个字段中,以下是详细的实现步骤和代码示例:

定义模型

我们需要一个模型来存储数据,包括一个用于记录用户的外键字段,假设我们有一个名为MyModel的模型,其中包含一个user字段来记录创建或修改该记录的用户。

from django.db import models
from django.contrib.auth.models import User
class MyModel(models.Model):
    name = models.CharField(max_length=100)
    description = models.TextField()
    created_by = models.ForeignKey(User, on_delete=models.CASCADE, related_name='created_mymodels')
    updated_by = models.ForeignKey(User, on_delete=models.CASCADE, related_name='updated_mymodels', null=True, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    def __str__(self):
        return self.name

创建或更新Admin类

我们需要创建一个自定义的Admin类,并重写save_model方法,以便在保存模型实例时自动记录当前用户。

from django.contrib import admin
from .models import MyModel
class MyModelAdmin(admin.ModelAdmin):
    def save_model(self, request, obj, form, change):
        if not change or not obj.updated_by:
            obj.created_by = request.user
        obj.updated_by = request.user
        super().save_model(request, obj, form, change)
admin.site.register(MyModel, MyModelAdmin)

注册Admin类

我们需要在admin.py文件中注册我们的自定义Admin类。

如何在Django Admin中实现添加数据时自动记录用户信息到表中?  第1张

from django.contrib import admin
from .models import MyModel
from .admin import MyModelAdmin
admin.site.register(MyModel, MyModelAdmin)

迁移数据库

确保你的数据库已经迁移,以便包含新的字段。

python manage.py makemigrations
python manage. py migrate

测试功能

当你在Django Admin中添加或编辑MyModel实例时,当前用户将自动记录在created_byupdated_by字段中。

FAQs

Q1: 如果多个用户同时编辑同一条记录,updated_by字段会如何变化?

A1:updated_by字段将始终记录最后一次编辑该记录的用户,由于每次编辑都会调用save_model方法,因此updated_by字段会被更新为最后一次编辑的用户。

Q2: 如果我想在保存时记录更多信息,比如时间戳,应该如何实现?

A2: 你可以在save_model方法中添加更多的逻辑来记录额外的信息,你可以添加一个last_edited_at字段,并在每次保存时更新它:

class MyModel(models.Model):
    # ... other fields ...
    last_edited_at = models.DateTimeField(auto_now=True)
    def __str__(self):
        return self.name
class MyModelAdmin(admin.ModelAdmin):
    def save_model(self, request, obj, form, change):
        if not change or not obj.updated_by:
            obj.created_by = request.user
        obj.updated_by = request.user
        obj.last_edited_at = timezone.now()  # 记录最后编辑时间
        super().save_model(request, obj, form, change)

小编有话说

通过重写Django Admin的save_model方法,我们可以在保存模型实例时自动记录当前用户,这在很多场景下都非常有用,比如审计日志、版本控制等,希望本文能帮助你更好地理解和实现这一功能,如果你有任何问题或建议,欢迎在评论区留言!

0