首页 > 解决方案 > 当用户新注册时,我对创建用户个人资料感到困惑

问题描述

视图.py

def register_view(request):
    if request.method == 'POST':
        form = UserForm(request.POST)
        if form.is_valid():
            user = form.save()
##            login(request,user)
            messages.success(request,'Account created succcessfully')
            return redirect('login')
        else:
            messages.error(request,'Invalid information! Please retry!')
    else:
        form = UserForm()
    context = {'form':form}
    return render(request,'register.html',context)

def login_view(request):
    if request.method == 'POST':
        form = AuthenticationForm(data=request.POST)
        if form.is_valid():
            username = form.cleaned_data.get('username')
            password = form.cleaned_data.get('password')
            user = authenticate(username=username,password=password)
            if user is not None:
                login(request,user)
                return redirect('homepage')
            else:
                messages.error(request,'No current user!')
    else:
        form = AuthenticationForm()
    context = {'form':form}
    return render(request,'login.html',context)

def logout_view(request):
    logout(request)
    return redirect('login')

@login_required
def profile(request):
    Profile.objects.get_or_create(user=request.user)
    if request.method == 'POST':
        u_form = UserUpdateForm(request.POST,instance=request.user)
        p_form = ProfileForm(request.POST,request.FILES,instance=request.user.profile)
        if u_form.is_valid() and p_form.is_valid():
            u_form.save()
            p_form.save()
            messages.success(request,'Profile updated successfully!')
            return redirect('profile')
    else:
        u_form = UserUpdateForm(instance=request.user)
        p_form = ProfileForm(instance=request.user.profile)
    
    context = {
##            'user':request.user,
            'u_form':u_form,
            'p_form':p_form,
    }
    return render(request,'profile.html',context)

信号.py

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


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

模型.py

class Profile(models.Model):
    name = models.OneToOneField(User,on_delete=models.CASCADE)
    mobile = models.IntegerField(null=True)
    address = models.CharField(max_length=350,null=True)
    image = models.ImageField(upload_to='profile_pics', default='default.png',null=True)

    def __str__(self):
        return str(self.name.username)+'\'s Profile'

表格.py

class UserUpdateForm(forms.ModelForm):
    email = forms.EmailField()
    class Meta:
        model = User
        fields = ['username', 'email']
        
class ProfileForm(forms.ModelForm):
    class Meta: 
        model = Profile
        fields = ['mobile', 'address', 'image'] 

错误信息:

RelatedObjectDoesNotExist at /login/
User has no profile.

我面临一个问题,即尽管我使用了配置文件模型的信号,但无法创建或更新用户配置文件。当我登录注册用户时,错误消息告诉我用户没有个人资料。但是,如果我登录已创建配置文件的用户,它可以显示相关信息,因此对于新注册的用户如何自动为该用户创建配置文件?

标签: pythondjangoweb

解决方案


因为您有一个没有任何配置文件的现有用户,因为没有加载信号,所以如果它是超级用户,则创建该用户从终端创建新的超级用户顺便删除在管理面板登录后没有配置文件的现有用户我也在为我的网络使用信号这是我如何使用它的代码

我的模型.py

from django.db import models
from django.contrib.auth.models import User
from django.utils import timezone
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,)
    profile_pic = models.ImageField(upload_to='profile_pics', default='default.png',)
    first_name = models.CharField(max_length=50, blank=True)
    last_name = models.CharField(max_length=75, blank=True)
    dob = models.DateField(blank=True, null=True)
    joined_date = models.DateTimeField(default=timezone.now,editable=False)
    update_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.user.username

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

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

告诉我你是否还有错误


推荐阅读