首页 > 解决方案 > 我应该如何设置允许经理为员工创建帐户的用户创建表单?

问题描述

所以我用 OneToOneField 扩展了我的用户模型。我的目标是让经理类型的用户能够创建员工用户。

我遇到的主要问题之一是填充啤酒厂外键字段。出于某种原因,每当我提交选择了啤酒厂的表格时,即使选择了 brewery_id,我也会收到“无法将值 NULL 插入到列‘brewery_id’中”。然而,仍然创建了一个用户,而不是扩展的客户部分。

理想情况下,我希望 brewery_id 根据创建该用户的经理为新用户填充。

我知道我的问题在我看来的某个地方,但我能找到的所有例子都只是为了更新当前用户。

模型.py:

class Customer(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    brewery = models.ForeignKey(Brewery, models.DO_NOTHING)
    phone_number = models.CharField(max_length=20)
    phone_carrier = models.CharField(max_length=80)
    role = models.CharField(max_length=60)

    class Meta:
        managed = True

@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    if created:
        Customer.objects.create(user=instance)

@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
    instance.customer.save()

表格.py:

class UserRegisterForm(UserCreationForm):
    email = forms.EmailField()

    class Meta:
        model = User
        fields = ['username', 'email', 'password1', 'password2']

class CustomerForm(forms.ModelForm):
    class Meta:
        model = Customer
        fields = ('brewery', 'phone_number', 'phone_carrier', 'role')

视图.py:

@login_required
def adminsite_register(request):
    if request.method == 'POST':
        user_form = UserRegisterForm(request.POST)
        cust_form = CustomerForm(request.POST)
        if user_form.is_valid() and cust_form.is_valid():
            user_form.save()
            cust_form.save()
            messages.success(request, f'Account has been created! You can now log in.')
            return redirect('index')
        else:
            messages.error(request, f'Please correct the errors.')
    else:
        user_form = UserRegisterForm(request.POST)
        cust_form = CustomerForm(request.POST)
    return render(request, "AdminSite/adminControls.html", {'user_form': user_form, 'cust_form': cust_form})

标签: djangodjango-modelsdjango-forms

解决方案


我认为问题在于您的信号接收器中的这条线:

if created:
    Customer.objects.create(user=instance)

这是试图在Customer不指定 a的情况下创建 aBrewery并将触发错误。

似乎您使用信号接收器的原因是将 aUser与 a相关联Customer。在视图中执行此关联可能更容易,例如:

@login_required
def adminsite_register(request):
    ...
    if user_form.is_valid() and cust_form.is_valid():
        user = user_form.save()
        customer = cust_form.save(commit=False)  # Don't commit the customer just yet
        customer.user = user  # Associate the user
        customer.save()  # Now save the customer
        ...

然后完全删除信号接收器。


推荐阅读