Django установил значение user is_active равным false при создании разделения сотрудников

#django #django-models #django-views

Вопрос:

У меня есть расширенная модель пользователя, связанная с моделью разделения сотрудников, и я хотел бы установить этого пользователя как неактивного с помощью SeparationCreateView. Это похоже на то, что когда сотрудник покидает компанию, он записывается с помощью этого представления разделения и автоматически отключает доступ сотрудников к приложению.

 class Employee(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)

class Separation(models.Model):
    employee = models.ForeignKey(Employee, on_delete=models.CASCADE)
 

Разделение создать представление работает, но оно не устанавливает для пользователя is_active значение false

 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.employee.user.is_active = False
        separation.save()
        return super().form_valid(form)
 

Что я здесь делаю не так? Любая помощь будет высоко оценена.

Ответ №1:

Вам нужно сохранить соответствующего сотрудника, поэтому:

 class SeparationCreateView(LoginRequiredMixin, CreateView):
    # ⋮

    def form_valid(self, form):
        user = form.save().employee.user
        user.is_active = False
        user.save()
        return super().form_valid(form) 

мы можем сделать это немного более эффективным с помощью:

 from django.contrib.auth import get_user_model

class SeparationCreateView(LoginRequiredMixin, CreateView):
    # ⋮

    def form_valid(self, form):
        separation = form.save()
        User = get_user_model()
        User.objects.filter(
             employee__separation=separation
        ).update(is_active=False)
        return super().form_valid(form) 

последний не будет запускать сигналы, прикрепленные к пользовательской модели.

Комментарии:

1. Выдающийся! Такая простая настройка, и вы сделали мою жизнь (и приложение) проще. Спасибо тебе @Willem