Как в Django сделать уникальный url профиля, который пользователь сможет изменять , но с проверкой существует ли уже такой url
Как в Django сделать уникальный url профиля, который пользователь сможет изменять , но с проверкой существует ли уже такой url? Хочу сделать так как у VK с профилями, типо по схеме: при регистрации пользователю присваевается рандомный url, а потом пользователь может поменять url на свой в профиле. Полазил в интернет но так и не понял, как это сделать в моём коде.
apps.py
from django.apps import AppConfig
class ProfilesConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'profiles'
def ready(self):
import profiles.signals # noqa
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
class Meta:
model = User
fields = ['username', 'email']
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()
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)
signals.py
from django.db.models.signals import post_save
from django.contrib.auth.models import User
from django.dispatch import receiver
from .models import Profile
@receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
@receiver(post_save, sender=User)
def save_profile(sender, instance, **kwargs):
instance.profile.save()
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):
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})
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')