Python Django-保存用户后获取用户id
我正在从事一个使用Python(3.7)和Django(2.2)的项目,在这个项目中,我为多种类型的用户实现了模型,并通过使用Python Django-保存用户后获取用户id,python,django,Python,Django,我正在从事一个使用Python(3.7)和Django(2.2)的项目,在这个项目中,我为多种类型的用户实现了模型,并通过使用multipleform在前端显示为单个表单来组合模型,之后,当我尝试在视图中创建一个用户并调用user模型的save方法并尝试获取其id时,它给出了一个错误 以下是我迄今为止所尝试的: 从models.py: class User(AbstractBaseUser, PermissionsMixin): email = models.EmailField(max
multipleform
在前端显示为单个表单来组合模型,之后,当我尝试在视图中创建一个用户并调用user
模型的save方法并尝试获取其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
}
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))
来自视图.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
}
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.save()
将返回用户对象的实例。您可以使用它获取id
多模式
不是Django的一部分,您没有发布指向提供此类的任何项目的链接,但显然是在这里:
user = form['user']
user
是UserForm
实例,而不是user
模型实例。您想要的是:
# good naming is key to readable code...
user_form = form['user']
profile_form = form['profile']
if user_type == 'Parent' or user_type == 'GC':
c_id = generate_cid()
user = user_form.save()
profile = profile_form.save(commit=False)
profile.user = user
profile.customer_id = c_id
profile.save()
return HttpResponseRedirect(reverse_lazy('users:login'))
还请注意,我删除了try/except子句,这比无用还要糟糕-在您的开发环境中,您希望让Django捕获这些错误并呈现更有用的调试页面(具有完整的回溯等),在生产环境中,您希望让Django捕获这些错误并返回500响应—如果您不进行干预,Django默认会执行这两项操作。一般来说,如果你不能有效地处理一个异常,就让它传播(不,当请求实际失败时返回一个200响应,并且可能泄漏一些内部信息,这不符合“有效处理”的条件)。以下内容对我来说很有用:
$ python manage.py shell
...
...
>>> from django.contrib.auth.models import User
>>> user = User.objects.create_user("test", password="test")
>>> user
<User: test>
>>> user.id
3
>>>
$python manage.py shell
...
...
>>>从django.contrib.auth.models导入用户
>>>user=user.objects.create_user(“test”,password=“test”)
>>>使用者
>>>用户id
3.
>>>
否,我需要user.id
要传入profile
的用户对象的实际id。您可以在视图中看到我正在尝试获取保存在正上方的用户id,因此此时它不在请求中,根据我的理解,在为用户调用save
后,它应该提供id
,即使用户在数据库中创建了一个id。我正在使用它,但它给出了错误,这就是问题所在。试着做:u=user.save()
profile.user=user.objects.get(id=u.id)
另一个错误是非空约束失败:users\u parent.user\u id
我在上述代码中没有看到任何users\u parent
实例。这可能来自您添加了约束为null=false
的user\u id
的模型,或者根本没有提到null
。我在上面添加了user
模型,请看一看!这是multiselform