Django创建员工离职记录时无法设置关联User的is_active为False
问题核心原因
你修改了关联User模型的is_active属性后,没有显式调用User模型的save()方法。Django的模型save()默认只会保存当前模型自身的字段变更,不会自动级联保存关联模型的修改,所以你对is_active的调整没有真正写入数据库。
修复后的视图代码
直接修改form_valid方法,补充User模型的保存逻辑即可:
class SeparationCreateView(LoginRequiredMixin, CreateView): model = Separation form_class = SeparationForm template_name = 'coreHR/separation.html' success_url = reverse_lazy('corehr:separations') def form_valid(self, form): separation = form.save(commit=False) separation.save() # 显式保存关联用户的状态修改 user = separation.employee.user user.is_active = False user.save() return super().form_valid(form)
可选优化方案
如果希望不管从什么入口创建离职记录(比如后台管理、批量导入、Shell操作)都能自动禁用用户,可以改用Django信号实现逻辑解耦:
- 在你的app的
signals.py中添加如下逻辑:
from django.db.models.signals import post_save from django.dispatch import receiver from .models import Separation @receiver(post_save, sender=Separation) def disable_user_on_separation(sender, instance, created, **kwargs): if created: user = instance.employee.user user.is_active = False user.save()
- 在app的
apps.py中注册信号:
from django.apps import AppConfig class CoreHRConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'coreHR' def ready(self): import coreHR.signals
用这种方式你就不需要在视图里写用户禁用的逻辑,所有创建离职记录的场景都会自动触发用户禁用。
内容的提问来源于stack exchange,提问作者John Todorovic
相关产品推荐
相关产品推荐

