重写django admin ,实现将编辑用户信息后的操作记录在指定数据库中
时间: 2023-05-27 17:07:51 浏览: 108
Django 重写用户模型的实现
重写Django Admin,实现将编辑用户信息后的操作记录在指定数据库中,可以通过以下步骤实现:
1. 创建一个新的model,用于记录用户信息的编辑记录。该model应该包含以下字段:用户ID、编辑时间、编辑前的信息、编辑后的信息、编辑者等。
2. 在Django Admin的ModelAdmin类中重写save_model方法,该方法会在保存model时被调用。在方法中,可以获取编辑前的信息和编辑后的信息,然后将操作记录保存到指定的数据库中。
3. 在Django Admin的ModelAdmin类中重写get_form方法,该方法会在显示表单时被调用。在方法中,可以将编辑前的信息写入表单中,以便管理员可以查看之前的信息。
例如,下面是一个简单的示例代码:
```python
from django.contrib import admin
from django.contrib.admin import ModelAdmin
from django.forms import ModelForm
from myapp.models import User, UserEditHistory
class UserEditForm(ModelForm):
class Meta:
model = User
fields = '__all__'
class UserEditHistoryAdmin(ModelAdmin):
list_display = ('user', 'edit_time', 'editor')
list_filter = ('user', 'editor')
search_fields = ('user__username', 'editor__username')
class UserAdmin(ModelAdmin):
form = UserEditForm
def save_model(self, request, obj, form, change):
if change:
old_obj = User.objects.get(pk=obj.pk)
if old_obj != obj:
UserEditHistory.objects.create(
user=obj,
edit_time=datetime.now(),
editor=request.user,
old_data=old_obj.__dict__,
new_data=obj.__dict__,
)
super().save_model(request, obj, form, change)
def get_form(self, request, obj=None, **kwargs):
if obj:
initial = obj.__dict__
kwargs['initial'] = initial
return super().get_form(request, obj, **kwargs)
admin.site.register(User, UserAdmin)
admin.site.register(UserEditHistory, UserEditHistoryAdmin)
```
在这个示例代码中,我们创建了一个新的model,即UserEditHistory,用于记录用户信息的编辑记录。然后,在UserAdmin类中重写了save_model方法和get_form方法。
在save_model方法中,我们判断是否为编辑操作,如果是,则获取旧的对象和新的对象,将它们的差异记录到UserEditHistory中。
在get_form方法中,我们获取对象的旧数据,并将其初始化到表单中,以便管理员可以查看之前的信息。
最后,我们在Django Admin中注册了User和UserEditHistory,以便可以进行管理操作。
阅读全文