Django url профиля через slug выдаёт ошибку
Хочу сделать возможность кастомного url у профилей пользователя. Вот мой код
views.py
from django.shortcuts import render, redirect
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from .forms import UpdateUserForm, UpdateProfileForm
@login_required
def profile(request, slug):
if request.method == 'POST':
user_form = UpdateUserForm(request.POST, instance=request.user)
profile_form = UpdateProfileForm(request.POST, request.FILES, 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 is updated successfully')
return redirect(to='profiles:users-profile')
else:
user_form = UpdateUserForm(instance=request.user)
profile_form = UpdateProfileForm(instance=request.user.profile)
return render(request, 'profiles/profile.html', {'user_form': user_form, 'profile_form': profile_form, 'slug': slug})
from django.urls import reverse_lazy
from django.contrib.auth.views import PasswordChangeView
from django.contrib.messages.views import SuccessMessageMixin
class ChangePasswordView(SuccessMessageMixin, PasswordChangeView):
template_name = 'users/change_password.html'
success_message = "Successfully Changed Your Password"
success_url = reverse_lazy('users-home')
forms.py
from django import forms
from django.contrib.auth.models import User
from .models import Profile
class UpdateUserForm(forms.ModelForm):
username = forms.CharField(max_length=100, required=True, widget=forms.TextInput(attrs={'class': ''})) # form-control
email = forms.EmailField(required=True, widget=forms.TextInput(attrs={'class': ''})) # form-control
slug = forms.SlugField(max_length=100, required=True, widget=forms.TextInput(attrs={'class': ''}))
class Meta:
model = User
fields = ['username', 'email', 'slug']
class UpdateProfileForm(forms.ModelForm):
avatar = forms.ImageField(widget=forms.FileInput(attrs={'class': 'input-file', 'id': 'file'})) # form-control-file
bio = forms.CharField(widget=forms.Textarea(attrs={'class': 'textarea_bio', 'rows': 5})) # form-control
class Meta:
model = Profile
fields = ['avatar', 'bio']
models.py
from django.db import models
from django.contrib.auth.models import User
from PIL import Image
# Extending User Model Using a One-To-One Link
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
avatar = models.ImageField(default='profile_images/default.jpg', upload_to='profile_images')
bio = models.TextField()
slug = models.SlugField(default = 'id', max_length=250)
def __str__(self):
return self.user.username
def save(self, *args, **kwargs):
super().save()
img = Image.open(self.avatar.path)
if img.height > 200 or img.width > 200: #100
new_img = (200, 200) #100
img.thumbnail(new_img)
img.save(self.avatar.path)
urls.py
from django.urls import path
from . import views
app_name = 'profiles'
urlpatterns=[
# path('', views.profile, name='users-profile'),
path('<slug:slug>/', views.profile, name='users-profile'),
]
Во views.py строка return redirect(to='profiles:users-profile') в таком виде работала, но из-за добавления slug перестала, я попытался изменить на return redirect(to='profiles:' slug), но это выдаёт ошибку:
NoReverseMatch at /profiles/id/
Reverse for 'users-profile' with no arguments not found. 1 pattern(s) tried: ['profiles/(?P<slug>[-a-zA-Z0-9_]+)/\\Z']
Как это исправить ?