在Django Admin中添加数据时,自动记录当前用户到表中的实现方法可以通过重写ModelAdmin类中的save_model方法来实现,以下是详细的步骤和示例代码:
确保你有一个包含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.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
字段中。
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界面还是自定义的视图中,这种需求都很常见,掌握这些技巧将大大提升你的开发效率,如果你有任何疑问或需要进一步的帮助,欢迎在评论区留言!