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

django admin添加数据自动记录user到表中的实现方法

在Django Admin中添加数据时,自动记录当前用户到表中的实现方法可以通过重写模型的 save方法或使用信号(signals)来实现。以下是一个简单的示例:1. **重写模型的 save方法**:, “ python, from django.db import models, from django.contrib.auth.models import User class MyModel(models.Model):, user = models.ForeignKey(User, on_delete=models.CASCADE), # 其他字段... def save(self, *args, **kwargs):, if not self.pk: # 如果是新创建的对象, self.user = get_current_user() # 获取当前用户的方法需要自定义, super().save(*args, **kwargs), ` 2. **使用信号(signals)**:, ` python, from django.db.models.signals import pre_save, from django.dispatch import receiver, from django.contrib.auth.models import User, from myapp.models import MyModel @receiver(pre_save, sender=MyModel), def set_user(sender, instance, **kwargs):, if not instance.pk: # 如果是新创建的对象, instance.user = get_current_user() # 获取当前用户的方法需要自定义, ` 注意:get_current_user()`是一个自定义函数,用于获取当前登录的用户。这通常需要在视图或中间件中设置一个线程局部变量来存储当前用户信息。

在Django Admin中,当你添加或编辑数据时,通常需要记录操作的用户信息,这可以通过覆盖模型的save方法来实现,将当前用户自动添加到表中,下面是一个详细的实现步骤:

创建Django项目和应用

确保你已经安装了Django并创建了一个项目和应用。

django-admin startproject myproject
cd myproject
python manage.py startapp myapp

定义模型

在你的应用(例如myapp)中定义一个模型,并添加一个字段来存储用户信息。

myapp/models.py
from django.db import models
from django.contrib.auth.models import User
class MyModel(models.Model):
    name = models.CharField(max_length=100)
    created_by = models.ForeignKey(User, on_delete=models.CASCADE, related_name='mymodel_created')
    updated_by = models.ForeignKey(User, on_delete=models.CASCADE, related_name='mymodel_updated', 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.py中注册你的模型,并覆盖save_model方法以记录用户信息。

myapp/admin.py
from django.contrib import admin
from .models import MyModel
class MyModelAdmin(admin.ModelAdmin):
    def save_model(self, request, obj, form, change):
        if not change:  # 如果是新建对象
            obj.created_by = request.user
        else:  # 如果是更新对象
            obj.updated_by = request.user
        obj.save()
    list_display = ('name', 'created_by', 'updated_by', 'created_at', 'updated_at')
admin.site.register(MyModel, MyModelAdmin)

迁移数据库

运行以下命令来创建数据库表:

django admin添加数据自动记录user到表中的实现方法

python manage.py makemigrations
python manage.py migrate

创建超级用户并登录Admin界面

创建一个超级用户并使用该用户登录Django Admin界面。

python manage.py createsuperuser

访问http://127.0.0.1:8000/admin并使用超级用户登录。

测试添加和编辑数据

在Admin界面中,导航到你的模型(例如MyModel),尝试添加和编辑数据,每次添加或编辑操作都会自动记录当前用户的信息。

django admin添加数据自动记录user到表中的实现方法

FAQs

Q1: 如果我不想记录更新者的信息,只想记录创建者的信息,该如何修改代码?

A1: 你只需要在save_model方法中去掉对updated_by字段的赋值即可,修改后的代码如下:

class MyModelAdmin(admin.ModelAdmin):
    def save_model(self, request, obj, form, change):
        if not change:  # 如果是新建对象
            obj.created_by = request.user
        obj.save()

Q2: 如何确保在批量添加或更新数据时也能记录用户信息?

django admin添加数据自动记录user到表中的实现方法

A2: 如果你需要处理批量添加或更新的情况,可以在表单类中覆盖save方法,并在其中调用save_model方法,示例如下:

myapp/forms.py
from django import forms
from .models import MyModel
class MyModelForm(forms.ModelForm):
    class Meta:
        model = MyModel
        fields = '__all__'
    def save(self, commit=True):
        instance = super().save(commit=False)
        if self.instance.pk is None:  # 如果是新建对象
            instance.created_by = self.current_user
        else:  # 如果是更新对象
            instance.updated_by = self.current_user
        if commit:
            instance.save()
        return instance

然后在admin.py中使用这个表单:

class MyModelAdmin(admin.ModelAdmin):
    form = MyModelForm
    def get_form(self, request, obj=None, **kwargs):
        form = super().get_form(request, obj, **kwargs)
        form.current_user = request.user
        return form

小编有话说

通过以上步骤,你可以轻松地在Django Admin中实现数据添加和编辑时自动记录用户信息的功能,这不仅有助于追踪数据的变更历史,还能提高系统的可维护性和安全性,希望这篇教程对你有所帮助,如果有任何问题或建议,欢迎在评论区留言!