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

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

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

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

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

定义模型

我们需要一个模型来存储数据,包括一个用于记录用户的外键字段,假设我们有一个名为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类。

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_by和updated_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