У меня возникла путаница с созданием профиля пользователя при новой регистрации пользователя

#python #django #web

Вопрос:

views.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)
 

signals.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()
 

models.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'
 

forms.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'] 
 

Ошибка msg:

 RelatedObjectDoesNotExist at /login/
User has no profile.
 

Я столкнулся с проблемой, из-за которой профиль пользователя не удалось создать или обновить, хотя я использовал сигналы для модели профиля. Когда я вошел в систему как зарегистрированный пользователь, в сообщении об ошибке говорилось, что у этого пользователя нет профиля. Однако, если я войду в систему пользователя, создавшего профиль, он может отобразить соответствующую информацию, поэтому для вновь зарегистрированного пользователя, как автоматически создать профиль для этого пользователя?

Комментарии:

1. в чем заключается сообщение об ошибке?

2. покажи свою signup_view

Ответ №1:

поскольку у вас есть существующий, у которого нет профиля, потому что не загружался сигнал, создайте этого пользователя, если он суперпользователь, создайте нового суперпользователя из терминала, удалите существующего, у которого нет профиля после входа в панель администратора. кстати, я также использую сигнал для своего веб-сайта. вот код, как я его использую.

мой models.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()
 

скажи мне, если у тебя все еще есть ошибка