实现django admin添加数据自动记录user到表中的方法,可以通过重载视图函数或使用信号实现。以下是详细攻略:
- 重载视图函数的实现方法
在django的admin视图中,可以通过获取当前请求的user,然后将其保存到特定的表中。首先,创建一个Mixin类,并且在其中添加特定的函数,使其能够记录用户信息。示例代码:
# accounts/mixin.py
from django.contrib.auth.mixins import AccessMixin
class UserRecordMixin(AccessMixin):
def form_valid(self, form):
form_object = form.save(commit=False)
# 如果数据库定义username属性,可以使用form.cleaned_data.get('username')获取
form_object.user = self.request.user
form_object.save()
return super().form_valid(form)
上述代码中,我们从django内置的AccessMixin
类继承并重载了form_valid
函数。form_valid
方法会在form验证成功后自动调用,将已验证的form保存。
需要注意,如果你在表单中使用ModelChoiceField
或其他特殊的Form fields,使用commit=False
后的model实例可能并不会被分配一个正确的值。
- 使用信号的实现方法
除了重载视图函数,还可以使用django内置的信号处理机制来实现自动记录用户信息的功能。示例代码:
# accounts/signals.py
from django.contrib.auth.signals import user_logged_in
from django.dispatch import receiver
from django.contrib.admin.options import BaseModelAdmin
class UserRecordMixin(BaseModelAdmin):
def save_model(self, request, obj, form, change):
obj.user = request.user
super().save_model(request, obj, form, change)
@receiver(user_logged_in)
def user_login_callback(sender, request, user, **kwargs):
request.session['_auth_user_id'] = user.pk
# blog/admin.py
from django.db import models
from django.contrib.auth.models import User
from django.contrib import admin
from blog.models import Post
from accounts.signals import UserRecordMixin
@admin.register(Post)
class PostAdmin(UserRecordMixin, admin.ModelAdmin):
list_display = ('title', 'user')
# ...
在上述示例代码中,我们使用了receiver
装饰器,并连接user_logged_in
信号。当用户登录后该信号会自动被触发。我们在定义的回调函数中设置了session,以记录当前登录的用户。
在UserCreateMixin
类中,我们利用了BaseModelAdmin
类来扩展章表的数据保存逻辑,将当前登录用户存储到对应的表中。
最后,在PostAdmin
中,我们通过UserCreateMixin
的继承和重写save_model
函数将当前用户添加到Post模型中。
总结
以上是django admin添加数据自动记录user到表中的实现方法,通过重载视图函数或使用信号,能够较为方便方式自动记录用户信息。使用信号还可以较为方便地扩展该自动记录功能到所有模型,避免重复实现相似的代码。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:django admin添加数据自动记录user到表中的实现方法 - Python技术站