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

如何在Django Admin中添加数据时自动记录操作用户到数据库表中?

### Django admin添加数据自动记录user到表中的实现方法:在models.py中定义包含user字段的模型类,如Setting;在admin.py中注册该模型并重写save_model方法,将request.user赋值给模型实例的user字段后保存,同时设置readonly_fields为user字段。

在Django Admin中添加数据时,自动记录当前用户到表中的实现方法可以通过重写ModelAdmin类中的save_model方法来实现,以下是详细的步骤和示例代码:

如何在Django Admin中添加数据时自动记录操作用户到数据库表中?  第1张

创建或修改你的模型

确保你有一个包含user字段的模型,如果没有,你需要先创建一个模型并添加这个字段。

from django.db import models
class MyModel(models.Model):
    name = models.CharField(max_length=100)
    description = models.TextField()
    created_by = models.ForeignKey('auth.User', on_delete=models.CASCADE, related_name='mymodels')
    def __str__(self):
        return self.name

注册模型到Admin

在你的admin.py文件中注册这个模型,并重写save_model方法:

from django.contrib import admin
from .models import MyModel
class MyModelAdmin(admin.ModelAdmin):
    # 显示的字段列表
    list_display = ('name', 'description', 'created_by')
    def save_model(self, request, obj, form, change):
        if not change:  # 如果是新创建的对象
            obj.created_by = request.user  # 将当前用户设置为创建者
        super().save_model(request, obj, form, change)
admin.site.register(MyModel, MyModelAdmin)

迁移数据库

如果你添加了新的字段,需要先迁移数据库:

python manage.py makemigrations
python manage.py migrate

测试功能

当你在Django Admin中添加一条新的MyModel记录时,当前登录的用户会自动被记录到created_by字段中。

FAQs

Q1: 如果我想在更新现有记录时也记录当前用户,应该怎么做?

A1: 你只需要移除if not change:条件判断即可,这样无论新增还是更新记录,都会记录当前用户,修改后的代码如下:

def save_model(self, request, obj, form, change):
    obj.created_by = request.user  # 始终将当前用户设置为创建者
    super().save_model(request, obj, form, change)

Q2: 如何在不使用Django Admin的情况下实现类似的功能?

A2: 如果你希望在不使用Django Admin的情况下实现类似功能,可以在视图函数中手动设置用户信息。

from django.shortcuts import render, get_object_or_404, redirect
from .models import MyModel
from .forms import MyModelForm  # 假设你已经创建了一个表单类
def create_mymodel(request):
    if request.method == "POST":
        form = MyModelForm(request.POST)
        if form.is_valid():
            mymodel = form.save(commit=False)
            mymodel.created_by = request.user  # 手动设置当前用户
            mymodel.save()
            return redirect('success_url')  # 重定向到成功页面或其他逻辑
    else:
        form = MyModelForm()
    return render(request, 'template.html', {'form': form})

小编有话说

通过上述方法,你可以在Django Admin中轻松实现添加数据时自动记录当前用户的功能,无论是在Admin界面还是自定义的视图中,这种需求都很常见,掌握这些技巧将大大提升你的开发效率,如果你有任何疑问或需要进一步的帮助,欢迎在评论区留言!

0