【发布时间】:2019-12-11 06:14:41
【问题描述】:
我正在使用 Python(3.7) 和 Django(2.2) 开发一个项目,其中我已经为多种类型的用户实现了模型,并通过使用 MultiModleForm 在前端显示为单个表单来组合模型,之后当我尝试在视图中创建用户并调用 user 模型的保存方法并尝试获取其 id 但它给出了错误。
这是我迄今为止尝试过的:
来自models.py:
class User(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(max_length=254, unique=True)
title = models.CharField(max_length=255, blank=False)
user_type = models.CharField(max_length=255, choices=USER_TYPE, blank=False)
gender = models.CharField(max_length=255, choices=CHOICES, blank=False)
contenst = models.CharField(max_length=255, blank=True)
is_staff = models.BooleanField(default=False)
is_superuser = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
last_login = models.DateTimeField(null=True, blank=True)
date_joined = models.DateTimeField(auto_now_add=True)
USERNAME_FIELD = 'email'
EMAIL_FIELD = 'email'
REQUIRED_FIELDS = ['password']
objects = UserManager()
def get_absolute_url(self):
return "/users/%i/" % (self.pk)
class Parent(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
contact_email = models.EmailField(blank=False)
customer_id = models.BigIntegerField(blank=False)
contact_no = PhoneNumberField(blank=True, help_text='Phone number must be entered in the'
'format: \'+999999999\'. Up to 15 digits allowed.')
collection_use_personal_data = models.BooleanField(blank=False)
来自forms.py:
class ParentForm(forms.ModelForm):
class Meta:
model = Parent
fields = ('contact_email', 'contact_no', 'collection_use_personal_data')
class UserParentForm(MultiModelForm):
form_classes = {
'user': UserForm,
'profile': ParentForm
}
来自views.py:
def post(self, request, *args, **kwargs):
print(request.POST)
user_type = request.POST.copy()['user-user_type']
form = None
if user_type == 'PB':
form = UserBelow18Form(request.POST)
elif user_type == 'PA':
form = UserAbove18Form(request.POST)
elif user_type == 'Parent':
form = UserParentForm(request.POST)
print('user-parent form selected')
elif user_type == 'GC':
form = UserGCForm(request.POST)
if form.is_valid():
user = form['user']
profile = form['profile']
if user_type == 'Parent' or user_type == 'GC':
c_id = generate_cid()
profile.customer_id = c_id
print('id generated for parent or GC: {}'.format(c_id))
try:
user.save()
profile.user = User.objects.get(id=user.id)
# print(user_obj.email)
# profile.user = user_obj.id
profile.save()
print(user.email)
return HttpResponseRedirect(reverse_lazy('users:login'))
except Exception as e:
return HttpResponse('something as: {}'.format(e))
但我得到的错误是:
类似于:'UserForm' 对象没有属性 'id'
【问题讨论】:
-
不,我需要
user.id用户对象的实际ID 才能传入profile。 -
您可以在
views中看到我正在尝试获取上面保存的用户的ID,因此根据我调用后的理解,目前不在request中用户的save应该提供id,即使用户是在数据库中创建的并带有一个ID。