django - 我应该如何设置允许经理为员工创建帐户的用户创建表单?
问题描述
所以我用 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})
解决方案
我认为问题在于您的信号接收器中的这条线:
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
...
然后完全删除信号接收器。
推荐阅读
- html - 定位引导弹出框
- javascript - 在添加的 jQuery 函数中,我可以知道触发的 DOM 对象吗?
- xaml - 内容控件不更新文本
- mysql - 显示来自其他 2 个表的相交表的相应数据
- reactjs - react-hooks:在useEffect中跳过第一次运行
- javascript - Javascript if 和 else if 语句
- sas - 在 SAS 数据步骤中编写 Ackermann 函数
- android - React-Native 应用程序在签名的 APK 上显示白屏
- java - 从传递父对象引用的 jrxml 调用自定义 Java 方法
- asp.net - 如何在 C# 中从远程计算机访问 Active Directory