NoReverseMatch at /edit_profile/ Reverse for 'profile' with no arguments not found. 1 pattern(s) tried: ['profile/(?P<username>[^/]+)$']
Question:
I am trying to build a blog website. In the profile update section I am getting this error.
NoReverseMatch at /edit_profile/ Reverse for ‘profile’ with no arguments not found. 1 pattern(s) tried: [‘profile/(?P[^/]+)$’]
I understand the error but I don’t know how to solve it. Please help me.
models.py:
from django.db import models
from django.contrib.auth.models import User
from PIL import Image
GENDER = (
(None, 'Choose your gender'),
('male', 'Male'),
('female', 'Female'),
('custom', 'Custom'),
('Prefer Not To Say', 'Prefer Not To Say'),
)
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
image = models.ImageField(default='profile_default.png', upload_to= 'profile_pics')
bio = models.TextField(max_length=50, blank=True)
gender = models.CharField(max_length=50, choices=GENDER, verbose_name="gender", blank=True)
def __str__(self):
return f'{self.user}'s Profile'
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
img = Image.open(self.image.path)
if img.width > 300 or img.height > 300:
output_size = (300, 300)
img.thumbnail(output_size)
img.save(self.image.path)
forms.py
class UserEditForm(forms.ModelForm):
first_name = forms.CharField(label='Full Name' ,max_length=150)
email = forms.EmailField()
class Meta:
model = User
fields = ['first_name', 'username', 'email']
class EditProfileForm(forms.ModelForm):
class Meta:
model = Profile
fields = ['gender','image', 'bio']
widgets = {
forms.Select(attrs={'class': 'custom-select md-form'})
}
urls.py
urlpatterns = [
path('admin/', admin.site.urls),
# post_stuff urls
path('', include('post_stuff.urls')),
# user urls
path('signup/', user_views.signup, name='signup'),
path('login/', user_views.Login.as_view(template_name='user/login.html'), name='login'),
path('logout/', auth_views.LogoutView.as_view(template_name='user/logout.html'), name='logout'),
path('profile/<str:username>', user_views.profile, name='profile'),
path('edit_profile/', user_views.edit_profile, name='edit_profile')
]
views.py
def profile(request, username=None):
user = get_object_or_404(User, username=username)
context = {
'title': 'Profile',
'user_id': user
}
return render(request, 'user/profile.html', context)
def edit_profile(request, username):
if request.method == 'POST':
e_user = UserEditForm(request.POST, instance=request.user)
e_profile = EditProfileForm(request.POST, request.FILES, instance=request.user.profile)
if e_user.is_valid() and e_profile.is_valid():
e_user.save()
e_profile.save()
messages.success(request, 'Profile Update successfull')
return redirect('profile')
else:
e_user = UserEditForm(instance=request.user)
e_profile = EditProfileForm(instance=request.user.profile)
context = {
'title': 'Profile Edit',
'user_form': e_user,
'profile_form': e_profile
}
return render(request, 'user/profile_edit.html', context)
profile.html
{% extends 'base.html' %}
{% block content %}
<div class="content-section">
<h1 style="color: rgb(12, 79, 224);" class="col-md-4">Profile</h1>
<hr>
<div class="container emp-profile">
<!-- Logged in user profile -->
{% if user_id == request.user %}
<div class="row">
<div class="col-md-4">
<div class="profile-img">
<img src="{{ request.user.profile.image.url }}" alt="{{ request.user.first_name }}" />
</div>
</div>
<div class="col-md-6">
<div class="profile-head">
<h5>
{{ user.first_name }}
</h5>
<footer class="text-muted" style="color: black;">
{{ user.username }}
</footer>
<br>
<br>
<ul class="nav nav-tabs" id="myTab" role="tablist">
<li class="nav-item">
<b>About</b>
</li>
</ul>
</div>
</div>
<div class="col-md-2">
<button class="profile-edit-btn"><a href="{% url 'edit_profile' %}">Edit Profile</a></button>
</div>
</div>
<div class="row">
<div class="col-md-4">
<div class="profile-work">
<b>Bio:</b><br>
{% if user.profile.bio %}
<small>{{ user.profile.bio }}</small>
{% else %}
<small style="color: red;"><strong> Tell us about you.</strong></small>
{% endif %}
</div>
</div>
<div class="col-md-8">
<div class="tab-content profile-tab" id="myTabContent">
<div class="tab-pane fade show active" id="home" role="tabpanel" aria-labelledby="home-tab">
<div class="row">
<div class="col-md-3">
<label>Name:</label>
</div>
<div class="col-md-0">
<p>{{ user.first_name }}</p>
</div>
</div>
<div class="row">
<div class="col-md-3">
<label>Username:</label>
</div>
<div class="col-md-0">
<p>{{ user.username }}</p>
</div>
</div>
<div class="row">
<div class="col-md-3">
<label>Email:</label>
</div>
<div class="col-md-0">
<p>{{ user.email }}</p>
</div>
</div>
<div class="row">
<div class="col-md-3">
<label>Gender:</label>
</div>
<div class="col-md-0">
{% if user.profile.gender %}
<p>{{ user.profile.gender }}</p>
{% else %}
<p style="color: red;">Please select your <strong>gender</strong> </p>
{% endif %}
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Post author profile -->
{% else %}
<div class="row">
<div class="col-md-4">
<div class="profile-img">
<img src="{{ user_id.profile.image.url }}" alt="{{ user_id.first_name }}" />
</div>
</div>
<div class="col-md-6">
<div class="profile-head">
<h5>
{{ user_id.first_name }}
</h5>
<footer class="text-muted" style="color: black;">
{{ user_id.username }}
</footer>
<br>
<br>
<ul class="nav nav-tabs" id="myTab" role="tablist">
<li class="nav-item">
<b>About</b>
</li>
</ul>
</div>
</div>
</div>
<div class="row">
<div class="col-md-4">
<div class="profile-work">
<b>Bio:</b><br>
{% if user_id.profile.bio %}
<small>{{ user_id.profile.bio }}</small>
{% else %}
<small style="color: red;"><strong> Tell us about you.</strong></small>
{% endif %}
</div>
</div>
<div class="col-md-8">
<div class="tab-content profile-tab" id="myTabContent">
<div class="tab-pane fade show active" id="home" role="tabpanel" aria-labelledby="home-tab">
<div class="row">
<div class="col-md-3">
<label>Name:</label>
</div>
<div class="col-md-0">
<p>{{ user_id.first_name }}</p>
</div>
</div>
<div class="row">
<div class="col-md-3">
<label>Username:</label>
</div>
<div class="col-md-0">
<p>{{ user_id.username }}</p>
</div>
</div>
<div class="row">
<div class="col-md-3">
<label>Email:</label>
</div>
<div class="col-md-0">
<p>{{ user_id.email }}</p>
</div>
</div>
<div class="row">
<div class="col-md-3">
<label>Gender:</label>
</div>
<div class="col-md-0">
{% if user_id.profile.gender %}
<p>{{ user_id.profile.gender }}</p>
{% else %}
<p style="color: red;">Please select your <strong>gender</strong> </p>
{% endif %}
</div>
</div>
</div>
</div>
</div>
</div>
{% endif %}
</div>
</div>
<br>
{% endblock %}
profile_edit.html
{% extends 'base.html' %}
{% load crispy_forms_tags %}
{% block content %}
<br><br>
<div class="content-section">
<form method="POST" enctype="multipart/form-data">
{% csrf_token %}
<fieldset class="form-group">
<legend class="border-bottom mb-4">Edit Profile</legend>
{{ user_form|crispy }}
{{ profile_form|crispy }}
</fieldset>
<div class="form-group">
<button class="btn btn-outline-info" type="submit">Update</button>
</div>
</form>
</div>
{% endblock %}
Answers:
try:
from django.urls import reverse
return redirect(reverse('profile', args=[request.user.username]))
In your edit_profile
view, you need to pass the username as parameter for the URL pattern, so:
def edit_profile(request, username):
if request.method == 'POST':
e_user = UserEditForm(request.POST, instance=request.user)
e_profile = EditProfileForm(request.POST, request.FILES, instance=request.user.profile)
if e_user.is_valid() and e_profile.is_valid():
user = e_user.save()
e_profile.save()
messages.success(request, 'Profile Update successfull')
# pass username ↓ ↓
return redirect('profile', username=username)
# …
Thanks for the answers guys,I finally figured it out with your help.
I am trying to build a blog website. In the profile update section I am getting this error.
NoReverseMatch at /edit_profile/ Reverse for ‘profile’ with no arguments not found. 1 pattern(s) tried: [‘profile/(?P[^/]+)$’]
I understand the error but I don’t know how to solve it. Please help me.
models.py:
from django.db import models
from django.contrib.auth.models import User
from PIL import Image
GENDER = (
(None, 'Choose your gender'),
('male', 'Male'),
('female', 'Female'),
('custom', 'Custom'),
('Prefer Not To Say', 'Prefer Not To Say'),
)
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
image = models.ImageField(default='profile_default.png', upload_to= 'profile_pics')
bio = models.TextField(max_length=50, blank=True)
gender = models.CharField(max_length=50, choices=GENDER, verbose_name="gender", blank=True)
def __str__(self):
return f'{self.user}'s Profile'
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
img = Image.open(self.image.path)
if img.width > 300 or img.height > 300:
output_size = (300, 300)
img.thumbnail(output_size)
img.save(self.image.path)
forms.py
class UserEditForm(forms.ModelForm):
first_name = forms.CharField(label='Full Name' ,max_length=150)
email = forms.EmailField()
class Meta:
model = User
fields = ['first_name', 'username', 'email']
class EditProfileForm(forms.ModelForm):
class Meta:
model = Profile
fields = ['gender','image', 'bio']
widgets = {
forms.Select(attrs={'class': 'custom-select md-form'})
}
urls.py
urlpatterns = [
path('admin/', admin.site.urls),
# post_stuff urls
path('', include('post_stuff.urls')),
# user urls
path('signup/', user_views.signup, name='signup'),
path('login/', user_views.Login.as_view(template_name='user/login.html'), name='login'),
path('logout/', auth_views.LogoutView.as_view(template_name='user/logout.html'), name='logout'),
path('profile/<str:username>', user_views.profile, name='profile'),
path('edit_profile/', user_views.edit_profile, name='edit_profile')
]
views.py
def profile(request, username=None):
user = get_object_or_404(User, username=username)
context = {
'title': 'Profile',
'user_id': user
}
return render(request, 'user/profile.html', context)
def edit_profile(request, username):
if request.method == 'POST':
e_user = UserEditForm(request.POST, instance=request.user)
e_profile = EditProfileForm(request.POST, request.FILES, instance=request.user.profile)
if e_user.is_valid() and e_profile.is_valid():
e_user.save()
e_profile.save()
messages.success(request, 'Profile Update successfull')
return redirect('profile')
else:
e_user = UserEditForm(instance=request.user)
e_profile = EditProfileForm(instance=request.user.profile)
context = {
'title': 'Profile Edit',
'user_form': e_user,
'profile_form': e_profile
}
return render(request, 'user/profile_edit.html', context)
profile.html
{% extends 'base.html' %}
{% block content %}
<div class="content-section">
<h1 style="color: rgb(12, 79, 224);" class="col-md-4">Profile</h1>
<hr>
<div class="container emp-profile">
<!-- Logged in user profile -->
{% if user_id == request.user %}
<div class="row">
<div class="col-md-4">
<div class="profile-img">
<img src="{{ request.user.profile.image.url }}" alt="{{ request.user.first_name }}" />
</div>
</div>
<div class="col-md-6">
<div class="profile-head">
<h5>
{{ user.first_name }}
</h5>
<footer class="text-muted" style="color: black;">
{{ user.username }}
</footer>
<br>
<br>
<ul class="nav nav-tabs" id="myTab" role="tablist">
<li class="nav-item">
<b>About</b>
</li>
</ul>
</div>
</div>
<div class="col-md-2">
<button class="profile-edit-btn"><a href="{% url 'edit_profile' %}">Edit Profile</a></button>
</div>
</div>
<div class="row">
<div class="col-md-4">
<div class="profile-work">
<b>Bio:</b><br>
{% if user.profile.bio %}
<small>{{ user.profile.bio }}</small>
{% else %}
<small style="color: red;"><strong> Tell us about you.</strong></small>
{% endif %}
</div>
</div>
<div class="col-md-8">
<div class="tab-content profile-tab" id="myTabContent">
<div class="tab-pane fade show active" id="home" role="tabpanel" aria-labelledby="home-tab">
<div class="row">
<div class="col-md-3">
<label>Name:</label>
</div>
<div class="col-md-0">
<p>{{ user.first_name }}</p>
</div>
</div>
<div class="row">
<div class="col-md-3">
<label>Username:</label>
</div>
<div class="col-md-0">
<p>{{ user.username }}</p>
</div>
</div>
<div class="row">
<div class="col-md-3">
<label>Email:</label>
</div>
<div class="col-md-0">
<p>{{ user.email }}</p>
</div>
</div>
<div class="row">
<div class="col-md-3">
<label>Gender:</label>
</div>
<div class="col-md-0">
{% if user.profile.gender %}
<p>{{ user.profile.gender }}</p>
{% else %}
<p style="color: red;">Please select your <strong>gender</strong> </p>
{% endif %}
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Post author profile -->
{% else %}
<div class="row">
<div class="col-md-4">
<div class="profile-img">
<img src="{{ user_id.profile.image.url }}" alt="{{ user_id.first_name }}" />
</div>
</div>
<div class="col-md-6">
<div class="profile-head">
<h5>
{{ user_id.first_name }}
</h5>
<footer class="text-muted" style="color: black;">
{{ user_id.username }}
</footer>
<br>
<br>
<ul class="nav nav-tabs" id="myTab" role="tablist">
<li class="nav-item">
<b>About</b>
</li>
</ul>
</div>
</div>
</div>
<div class="row">
<div class="col-md-4">
<div class="profile-work">
<b>Bio:</b><br>
{% if user_id.profile.bio %}
<small>{{ user_id.profile.bio }}</small>
{% else %}
<small style="color: red;"><strong> Tell us about you.</strong></small>
{% endif %}
</div>
</div>
<div class="col-md-8">
<div class="tab-content profile-tab" id="myTabContent">
<div class="tab-pane fade show active" id="home" role="tabpanel" aria-labelledby="home-tab">
<div class="row">
<div class="col-md-3">
<label>Name:</label>
</div>
<div class="col-md-0">
<p>{{ user_id.first_name }}</p>
</div>
</div>
<div class="row">
<div class="col-md-3">
<label>Username:</label>
</div>
<div class="col-md-0">
<p>{{ user_id.username }}</p>
</div>
</div>
<div class="row">
<div class="col-md-3">
<label>Email:</label>
</div>
<div class="col-md-0">
<p>{{ user_id.email }}</p>
</div>
</div>
<div class="row">
<div class="col-md-3">
<label>Gender:</label>
</div>
<div class="col-md-0">
{% if user_id.profile.gender %}
<p>{{ user_id.profile.gender }}</p>
{% else %}
<p style="color: red;">Please select your <strong>gender</strong> </p>
{% endif %}
</div>
</div>
</div>
</div>
</div>
</div>
{% endif %}
</div>
</div>
<br>
{% endblock %}
profile_edit.html
{% extends 'base.html' %}
{% load crispy_forms_tags %}
{% block content %}
<br><br>
<div class="content-section">
<form method="POST" enctype="multipart/form-data">
{% csrf_token %}
<fieldset class="form-group">
<legend class="border-bottom mb-4">Edit Profile</legend>
{{ user_form|crispy }}
{{ profile_form|crispy }}
</fieldset>
<div class="form-group">
<button class="btn btn-outline-info" type="submit">Update</button>
</div>
</form>
</div>
{% endblock %}
try:
from django.urls import reverse
return redirect(reverse('profile', args=[request.user.username]))
In your edit_profile
view, you need to pass the username as parameter for the URL pattern, so:
def edit_profile(request, username):
if request.method == 'POST':
e_user = UserEditForm(request.POST, instance=request.user)
e_profile = EditProfileForm(request.POST, request.FILES, instance=request.user.profile)
if e_user.is_valid() and e_profile.is_valid():
user = e_user.save()
e_profile.save()
messages.success(request, 'Profile Update successfull')
# pass username ↓ ↓
return redirect('profile', username=username)
# …
Thanks for the answers guys,I finally figured it out with your help.