发布
社区首页 >问答首页 >用一对一关系扩展django用户模型

用一对一关系扩展django用户模型
EN

Stack Overflow用户
提问于 2022-08-05 10:43:39
回答 2查看 90关注 0票数 0

我对dajngo非常陌生,我试图从用户那里获取更多的数据,并将它们插入profile表我的模型中。

代码语言:javascript
代码运行次数:0
复制
from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    bio = models.TextField(max_length=500, blank=True,null=True)
    location = models.CharField(max_length=30, blank=True,null=True)
    birth_date = models.DateField(null=True, blank=True)

@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)

@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
    instance.profile.save()

我的表格

代码语言:javascript
代码运行次数:0
复制
from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
from users.models import Profile


class UserRegistrationForm(UserCreationForm):
    first_name = forms.CharField(max_length=101)
    last_name = forms.CharField(max_length=101)
    email = forms.EmailField()

    class Meta:
        model = User
        fields = ['username', 'first_name', 'last_name', 'email', 'password1', 'password2']

class ProfileForm(forms.ModelForm):
    class Meta:
        model = Profile
        fields=['bio','location','birth_date']

还有我的观点

代码语言:javascript
代码运行次数:0
复制
def register(request):
    if request.method == 'POST':
        user_form = UserRegistrationForm(request.POST)
        profile_form = ProfileForm(request.POST)
        if user_form.is_valid() and profile_form.is_valid():
            user_form.save()
            profile_form.save()
            messages.success(request, 'Your profile was successfully updated!')
            return redirect('home')
        else:

            messages.error(request,'Please correct the error below.')
    else:
        user_form = UserRegistrationForm()
        profile_form = ProfileForm()
    return render(request, 'users/register.html', {
        'user_form': user_form,
        'profile_form': profile_form
    })

当我试图保存表单时,我会得到错误。

代码语言:javascript
代码运行次数:0
复制
django.db.utils.IntegrityError: NOT NULL constraint failed: users_profile.user_id

我知道这是因为我调用了profile_form上的保存,而且它不知道用户id实例,但是如何修复它呢?

EN

回答 2

Stack Overflow用户

发布于 2022-08-05 10:50:44

您可以在对象保存到数据库之前使用commit=False来编辑它。然后,您可以将配置文件附加到用户并保存它,如下所示:

代码语言:javascript
代码运行次数:0
复制
if user_form.is_valid() and profile_form.is_valid():
    user = user_form.save()
    profile = profile_form.save(commit=False)
    profile.user = user
    profile.save()

一旦修复了这个问题,您可能会从您的post_save信号中得到一个错误,因为这里已经创建了一个配置文件,并且存在一对一的关系。

票数 1
EN

Stack Overflow用户

发布于 2022-08-06 09:03:13

这就是我最终解决问题的方式,互联网上的大多数例子都是关于已经创建和使用现有用户实例的用户帐户,无论如何,我做了以下更改:

views.py

代码语言:javascript
代码运行次数:0
复制
def register(request):
    if request.method == 'POST':
        user_form = UserRegistrationForm(request.POST)
        profile_form = ProfileForm(request.POST)
        if user_form.is_valid() and profile_form.is_valid():
            user = user_form.save()
            #user.refresh_from_db()
            user.profile.bio=profile_form.cleaned_data.get('bio')
            user.profile.location=profile_form.cleaned_data.get('location')
            user.save()
            messages.success(request, 'Your account successfully created!')
            return redirect('home')
        else:

            messages.error(request,'Please correct the error below.')
    else:
        user_form = UserRegistrationForm()
        profile_form = ProfileForm()
    return render(request, 'users/register.html', {
        'user_form': user_form,
        'profile_form': profile_form
    })

models.py

代码语言:javascript
代码运行次数:0
复制
from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    bio = models.TextField(max_length=500, blank=True,null=True)
    location = models.CharField(max_length=30, blank=True,null=True)
    birth_date = models.DateField(null=True, blank=True)


@receiver(post_save, sender=User)
def create_or_update_user_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)
    else:
        instance.profile.save()

与form.py相比没有变化。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73248510

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档