mx1txm
mx1txm

Reputation: 139

Django - User created but Profile is missing

When I register a new user, I can see from the Admin page that the user was created. But whenever I go on my profile page in my nav bar I get the following Error.

enter image description here

enter image description here

It was actually working before I added a function on my Profile page (a button that deletes a user&profile) but I don't see what I need to page to fix this error.

profile.html

{% extends "digitalFarm/base.html" %}
{% load crispy_forms_tags %}

{% block content %}
      <div class="content-section">
             <div class="media">
                    <img class="rounded-circle account-img" src="{{ user.profile.image.url }}">
                    <div class="media-body">
                           <h2 class="account-heading">{{ user.username }}</h2>
                           <p class="text-secondary">{{ user.email }}</p>
                    </div>
             </div>
          <form method="POST" enctype="multipart/form-data">
              {% csrf_token %}
              <fieldset class="form-group">
                  <legend class="boder-bottom mb-4">Profile info</legend>
                  {{ u_form|crispy }}
                  {{ p_form|crispy }}
                  {{ d_form|crispy }}
              </fieldset>
              <div class="form-group">
                  <button class="btn btn-outline-info" type="submit">Update Profile</button>
              </div>
          </form>

          <form>
              {% csrf_token %}
              <fieldset class="form-group">
                  <legend class="border-bottom mb-4">Delete User Account</legend>
              </fieldset>
              <div class="form-group">
                  <button class="btn btn-danger">
                      <a style="color: white" href="{% url 'profile_confirm_delete' %}">Delete Account</a></button>
              </div>
          </form>
      </div>
{% endblock content %}

views.py

    def register(request):
    if request.method == 'POST':
        form = UserRegisterForm(request.POST)
        if form.is_valid():
            form.save()
            username = form.cleaned_data.get('username')
            messages.success(request, f'Your account has been created! You are now able to login')
            return redirect('login')
    else:
        form = UserRegisterForm()
    return render(request, 'users/register.html', {'form': form})

def profile_confirm_delete(request):
    user = request.user
    context = {
        'user': user
    }
    return render(request, 'users/profile_confirm_delete.html', context)

@login_required
def profile(request):
    if request.method == 'DELETE':
        print('delete works')
        return redirect('digitalFarm-home')

    if request.method == 'POST':
        u_form = UserUpdateForm(request.POST, instance=request.user)
        p_form = ProfileUpdateForm(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, f'Your account has been updated!')
            return redirect('profile')
    else :
        u_form = UserUpdateForm(instance=request.user)
        p_form = ProfileUpdateForm(instance=request.user.profile)

    context = {
        'u_form' : u_form,
        'p_form' : p_form
    }
    return render(request, 'users/profile.html', context)

signals.py

@receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
    print("INSIDE CREATE_PROFILE")#negative
    if created:
        print("INSIDE CREATED_PROFILE")#negative
        Profile.objects.create(user=instance)

@receiver(post_save, sender=User)
def save_profile(sender, instance, **kwargs): #kwargs= accepts any additional keywords
        instance.profile.save()

@receiver(pre_delete, sender=User)
def delete_profile(sender, instance, **kwargs): #kwargs= accepts any additional keywords
        instance.profile.delete()

forms.py

class UserRegisterForm(UserCreationForm):
    email = forms.EmailField()

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

#Update
class UserUpdateForm(forms.ModelForm):
    email = forms.EmailField()

    class Meta:
        model = User
        fields = ['username', 'email']

class ProfileUpdateForm(forms.ModelForm):
    print("INSIDE ProfileUpdateForm")
    class Meta:
        model = Profile
        fields = ['image']

#Delete
class ProfileDeleteForm(forms.ModelForm):
    class Meta:
        model = Profile
        fields = ['image']

class UserDeleteForm(forms.ModelForm):
    class Meta:
        model = User
        fields = []   #Form has only submit button.  Empty "fields" list still necessary, though.

Upvotes: 0

Views: 541

Answers (1)

harry hartmann
harry hartmann

Reputation: 361

in your signals.py, I don't see any save() directive, how is your profile instance supposed to get in the DB, DB profile table is empty. You need something like this (for create):

Profile.objects.create(user=instance).save()

or actually

profileInstance = Profile.objects.create(user=instance)
profileInstance.initNewProfile() # setup context default values
profileInstance.save()

Further more, on delete there is actually better option to delete dependent instance: CASCADE on ORM level. Has to be defined in class (models.py)

Upvotes: 1

Related Questions