2017-09-19 3 views
2

J'ai créé le modèle de profil utilisateur. J'ai migré le modèle pour syn avec la base de données. Cependant, je reçois une erreur de User has no profile lorsque je route vers /profile (whose url is this url(r'^profile$', views.update_profile, name="profile"),) qui devrait appeler la vue update_profile où j'ai imprimé l'objet request avant de vérifier s'il s'agit d'une méthode POST ou non mais il n'est pas non plus affiché dans le shell. Où ai-je mal fait?RelatedObjectDoesNotExist at/profile

Voici mon code

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


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


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


class UserForm(forms.ModelForm): 

    class Meta: 
     model = User 
     fields = ('first_name', 'last_name', 'email') 


class ProfileForm(forms.ModelForm): 

    class Meta: 
     model = Profile 
     exclude = ('user',) 


def update_profile(request): 
    print('user ################', request.user, request.user.profile) 
    if request.method == 'POST': 
     user_form = UserForm(request.POST, instance=request.user) 
     profile_form = ProfileForm(
      request.POST or None, instance=request.user.profile) 
     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('products:profile') 
     else: 
      messages.error(
       request, ('There was an error updating your profile')) 
    else: 
     user_form = UserForm(instance=request.user) 
     profile_form = ProfileForm(instance=request.user.profile) 
    return render(request, 'dashboard/company/profile.html', {'user_form': user_form, 'profile_form': profile_form}) 

Répondre

2

Désolé, j'ai trouvé le résultat juste après avoir affiché la question. Si je dois supprimer la question, je vous le supprimer est autrement ici la solution pour cette

def update_profile(request): 
    try: 
     profile = request.user.profile 
    except Profile.DoesNotExist: 
     profile = Profile(user=request.user) 
    if request.method == 'POST': 
     user_form = UserForm(request.POST, instance=request.user) 
     profile_form = ProfileForm(
      request.POST or None, instance=profile) 
     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('products:profile') 
     else: 
      messages.error(
       request, ('There was an error updating your profile')) 
    else: 
     user_form = UserForm(instance=request.user) 
     profile_form = ProfileForm(instance=request.user.profile) 
    return render(request, 'dashboard/company/profile.html', {'user_form': user_form, 'profile_form': profile_form}) 

la partie à jour dans le code ci-dessus est

try: 
     profile = request.user.profile 
    except Profile.DoesNotExist: 
     profile = Profile(user=request.user) 

Je ne peux pas expliquer clairement mais en regardant le erreur, RelatedObjectDoesNotexist au profil m'a donné une idée pour vérifier si le request.user.profile existe ou pas alors j'ai essayé de cette façon et cela a fonctionné pour moi. N'hésitez pas à expliquer en détail, si quelqu'un le sait bien.

0

Vous pouvez écrire que dans le code un peu moins comme,

def update_profile(request): 
    profile = Profile.objects.get_or_create(user=request.user) 
    if request.method == 'POST': 
     user_form = UserForm(request.POST, instance=request.user) 
     profile_form = ProfileForm(
      request.POST or None, instance=profile) 
     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('products:profile') 
     else: 
      messages.error(
       request, ('There was an error updating your profile')) 
    else: 
     user_form = UserForm(instance=request.user) 
     profile_form = ProfileForm(instance=profile) 
    return render(request, 'dashboard/company/profile.html', {'user_form': user_form, 'profile_form': profile_form})