【发布时间】:2020-11-24 15:55:08
【问题描述】:
我在 Python 3.7.5、Django >=2.2.8、
class CustomUser(AbstractUser):
objects = CustomUserManager()
person = models.ForeignKey(
'Person', on_delete=models.DO_NOTHING, null=True)
class Person(models.Model):
uuid = models.UUIDField(primary_key=True, db_column='person_uuid')
first_name = models.CharField(max_length=255)
last_name = models.CharField(max_length=255)
address1 = models.CharField(max_length=255, blank=True, null=True)
address2 = models.CharField(max_length=255, blank=True, null=True)
add_date = models.DateTimeField(auto_now_add=True)
mod_date = models.DateTimeField(auto_now=True)
下面显示的 CreateUser 视图用于注册新用户。此视图由 2 个表单组成,一个用户创建表单和一个人员表单。一旦用户输入他们的详细信息,我想保存 person_form 并将 CustomUser 中的人员字段设置为新创建的人员。但是保存后pk的值总是None。
为了解决这个问题,我使用匹配的 first_name 和 last_name 查询 Person 模型,并使用响应中的 UUID。但这非常脆弱,因为我有其他模型使用 UUID 并且没有像 first_name 和 last_name 这样的唯一值。我想知道是否有更可靠的方法来获取刚刚保存的表单的 UUID。
class CreateUserView(View):
template_name = 'core/create_user.html'
def get(self, request, *args, **kwargs):
user_form = CustomUserCreationForm()
person_form = PersonForm()
context = {'person_form': person_form,
'user_form': user_form}
return render(request, self.template_name, context=context)
def post(self, request, *args, **kwargs):
person_form = PersonForm(request.POST)
user_form = CustomUserCreationForm(request.POST)
print('Person form is valid: {}'.format(person_form.is_valid()))
if person_form.is_valid() and user_form.is_valid():
print('User form is valid')
person = person_form.save()
print(f'PK of new person is: {person.pk}')
p = Person.objects.filter(first_name=person.first_name,
last_name=person.last_name).latest('add_date')
user = user_form.save(commit=False)
user.person = p
user.save()
messages.success(request, 'Account created successfully')
return redirect('login')
else:
return render(request, self.template_name, {'person_form': person_form,
'user_form': user_form})
注意:我意识到 Person 和 CustomUser 可以是一个单一的模型,但是 Person 在数据库的其他地方与其他实体一起使用,并且需要独立于用户
【问题讨论】: