You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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信号实现逻辑解耦:

  1. 在你的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()
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 17:36:00