【问题标题】:Trying to change new_manager.user.is_employee = False and set it as new_manager.user.is_manager = True , but not working尝试更改 new_manager.user.is_employee = False 并将其设置为 new_manager.user.is_manager = True ,但不起作用
【发布时间】:2022-01-15 13:17:18
【问题描述】:

将用户转换为经理后,我需要设置“is_employee = False”和“is_manager = True”。这个过程看起来很简单,但我无法让它工作。

models.py

class User(AbstractUser):
is_admin = models.BooleanField(default=False)
is_employee = models.BooleanField(default=True)
is_manager = models.BooleanField(default=False)

def __str__(self):
    return f'{self.first_name} {self.last_name} as {self.username}'


class Manager(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
user_profile = models.OneToOneField(Profile, on_delete=models.CASCADE)
business_unit = models.OneToOneField(BusinessUnit, on_delete=models.SET_NULL, null=True)
previous_business_units = models.CharField(max_length=100, default=None, blank=True, null=True)
manager_description = models.TextField(blank=True, null=True)
manager_created_date = models.DateTimeField(auto_now_add=True, blank=True, null=True)

def __str__(self):
    return f'{self.user.first_name} {self.user.last_name}'

views.py

@login_required
@admin_required
def manager_create_view(request):
form = ManagerCreationForm()
if request.method == 'POST':
    form = ManagerCreationForm(request.POST)
    if form.is_valid():
        new_manager = form.save(commit=False)
        group = Group.objects.get(name='Manager')
        new_manager.user.groups.add(group)
        new_manager.user.is_employee = False
        new_manager.user.is_manager = True
        new_manager = form.save()
        new_manager = form.cleaned_data.get('user')
        messages.success(request, f'{new_manager} is now a Manager!')
        return redirect ('list-managers')
    messages.error(request, 'Something went wrong, please check the hilighted field(s)')
context = {
    'title': 'Create Manager',
    'form': form
}
return render(request, 'managers/manager-form.html', context)

我也尝试过使用信号,但没有成功。

信号.py

from django.db.models.signals import post_save
from accounts.models import User, Manager
from django.dispatch import receiver

@receiver(post_save, sender=Manager)
def change_user_type(sender, instance, created, **kwargs):
  if created:
    instance.user.is_manager = True
    instance.user.is_employee = False

尝试自学,所以任何帮助将不胜感激! :)

【问题讨论】:

    标签: django forms validation


    【解决方案1】:

    你需要保存经理的用户,而不仅仅是经理本身,所以:

    @login_required
    @admin_required
    def manager_create_view(request):
        form = ManagerCreationForm()
        if request.method == 'POST':
            form = ManagerCreationForm(request.POST)
            if form.is_valid():
                new_manager = form.save()  # ? save the manager object
                group = Group.objects.get(name='Manager')
                user = new_manager.user
                user.groups.add(group)
                user.is_employee = False
                user.is_manager = True
                user.save()  # ? save the user object
                messages.success(request, f'{user} is now a Manager!')
                return redirect('list-managers')
            messages.error(request, 'Something went wrong, please check the hilighted field(s)')
        context = {
            'title': 'Create Manager',
            'form': form
        }
        return render(request, 'managers/manager-form.html', context)

    【讨论】:

    • 感谢@Willem "保存经理的用户...." 是因为 is_employee 和 is_manager 是 User 模型中的字段吗?
    • @Kim:是的,这也是存储这些的表,因此您需要对该表进行 UPDATE 查询(从而保存 that 模型的对象)。如果你保存一个模型,Django 将跟随外键并保存它们,这通常也是低效的,因为外键对象上的字段通常不会改变。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-23
    • 1970-01-01
    • 1970-01-01
    • 2012-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多