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-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.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)
运行以下命令来创建数据库表:
python manage.py makemigrations python manage.py migrate
创建一个超级用户并使用该用户登录Django Admin界面。
python manage.py createsuperuser
访问http://127.0.0.1:8000/admin
并使用超级用户登录。
在Admin界面中,导航到你的模型(例如MyModel
),尝试添加和编辑数据,每次添加或编辑操作都会自动记录当前用户的信息。
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: 如何确保在批量添加或更新数据时也能记录用户信息?
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中实现数据添加和编辑时自动记录用户信息的功能,这不仅有助于追踪数据的变更历史,还能提高系统的可维护性和安全性,希望这篇教程对你有所帮助,如果有任何问题或建议,欢迎在评论区留言!