#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