Python Django-保存用户后获取用户id

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

我正在从事一个使用Python(3.7)和Django(2.2)的项目,在这个项目中,我为多种类型的用户实现了模型,并通过使用
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