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 %}
Asked By: Bs Joy

||

Answers:

try:

from django.urls import reverse

return redirect(reverse('profile', args=[request.user.username]))
Answered By: Reza Heydari

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)
    # …
Answered By: Willem Van Onsem

Thanks for the answers guys,I finally figured it out with your help.

Answered By: prashant sharma
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.