01: 重写Django admin
时间: 2023-08-02 07:08:49 浏览: 63
好的,您想了解如何重写 Django admin 吗?如果是的话,我可以给您一些重写 Django admin 的方法。
首先,您可以通过继承 Django admin 中的模型管理器来自定义模型的管理界面。您可以在您的应用程序中创建一个名为 admin.py 的文件,并在其中定义您的自定义模型管理器。例如,您可以使用以下代码重写模型管理器:
```python
from django.contrib import admin
from .models import MyModel
class MyModelAdmin(admin.ModelAdmin):
# 定义您的自定义管理界面
admin.site.register(MyModel, MyModelAdmin)
```
这样,Django admin 将使用您自定义的模型管理器来管理您的模型。
另外,您还可以使用 Django admin 提供的各种钩子函数和模板标记来自定义 Django admin 的外观和行为。您可以在您的应用程序中创建一个名为 templates/admin/ 的目录,并在其中创建与 Django admin 中相应模板文件相对应的模板文件。然后,您可以在这些模板文件中使用模板标记和钩子函数来自定义 Django admin 的外观和行为。
希望这些信息能够对您有所帮助!
相关问题
重写django admin ,实现将编辑用户信息后的操作记录在指定数据库中
重写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,以便可以进行管理操作。
重写django admin ,实现将编辑用户权限或组的信息后的操作记录在指定数据库中
重写 Django admin 后,可以通过重写 ModelAdmin 中的 save_model 和 delete_model 方法来实现将编辑用户权限或组的信息后的操作记录在指定数据库中。
在 save_model 方法中,可以使用 Django 的 signals 模块来发送一个信号,然后在 receiver 函数中将操作信息保存到指定的数据库中。例如:
```python
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.contrib.auth.models import User, Group
from django.contrib.admin import ModelAdmin
class MyModelAdmin(ModelAdmin):
def save_model(self, request, obj, form, change):
super().save_model(request, obj, form, change)
if isinstance(obj, User) or isinstance(obj, Group):
post_save.send(sender=obj.__class__, instance=obj, created=change, using='log_db')
@receiver(post_save, sender=User, dispatch_uid="log_user_save")
@receiver(post_save, sender=Group, dispatch_uid="log_group_save")
def log_save(sender, instance, created, **kwargs):
# 将操作信息保存到指定的数据库中
pass
```
类似地,在 delete_model 方法中,也可以发送一个信号,然后在 receiver 函数中将操作信息保存到指定的数据库中。例如:
```python
from django.db.models.signals import pre_delete
from django.dispatch import receiver
from django.contrib.auth.models import User, Group
from django.contrib.admin import ModelAdmin
class MyModelAdmin(ModelAdmin):
def delete_model(self, request, obj):
if isinstance(obj, User) or isinstance(obj, Group):
pre_delete.send(sender=obj.__class__, instance=obj, using='log_db')
super().delete_model(request, obj)
@receiver(pre_delete, sender=User, dispatch_uid="log_user_delete")
@receiver(pre_delete, sender=Group, dispatch_uid="log_group_delete")
def log_delete(sender, instance, **kwargs):
# 将操作信息保存到指定的数据库中
pass
```