Reputation: 139
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.
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
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