Django 4.1: как добавить 'slug_field' в UpdateView для модели User из модели Profile

Я создал известную модель Profile для модели Django User и она имеет следующие поля: [profile_picture, bio, slug]

Я зарегистрировал модель Profile в модели User как StackedInLine

Я создал представление для редактирования полей Profile, используя slug в URLconf


Теперь я пытаюсь создать UpdateView для User модели, чтобы изменить поля, Но ему не хватает slug, Я пытался установить slug_field в self.profile.slug, но он возвращает строку, а не поле.


Как я могу создать UpdateView для модели User, используя User.profile.slug в качестве slug в URLconf? Я вообще использую правильный подход?

models.py:

from django.db import models
from django.contrib.auth.models import User
from django.urls import reverse

from .storage import OverwriteStorage


def get_upload_path(instance, filename):
    extension = filename.split('.')[-1]
    return f'{instance.user.username}/profile_picture.{extension}'


class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    bio = models.TextField(blank=True, null=True)
    profile_picture = models.ImageField(upload_to=get_upload_path, blank=True, storage=OverwriteStorage)
    slug = models.SlugField(blank=False, null=False)

    def get_absolute_url(self):
        return reverse('profile', kwargs={'slug': self.slug})

admin.py:

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.contrib.auth.models import User

from .models import Profile


class ProfileInline(admin.StackedInline):
    model = Profile
    can_delete = False
    verbose_name_plural = 'employee'


class UserAdmin(BaseUserAdmin):
    inlines = (ProfileInline,)


admin.site.unregister(User)
admin.site.register(User, UserAdmin)

views.py:

class UserAccountUpdateView(UpdateView):
    model = User
    form_class = UserAccountUpdateForm
    template_name = 'auth/edit_account.html'
    slug_field = 'username'

forms.py:

class UserAccountUpdateForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ('first_name', 'last_name', 'email', 'username', 'password')

    def __init__(self, *args, **kwargs):
        super(UserAccountUpdateForm, self).__init__(*args, **kwargs)

        self.fields['first_name'].widget.attrs['class'] = 'form-control bg-dark border border-secondary text-light'
        self.fields['last_name'].widget.attrs['class'] = 'form-control bg-dark border border-secondary text-light'
        self.fields['email'].widget.attrs['class'] = 'form-control bg-dark border border-secondary text-light'

        self.fields['username'].widget.attrs['class'] = 'form-control bg-dark border border-secondary text-light'
        self.fields['password'].widget.attrs['class'] = 'form-control bg-dark border border-secondary text-light'
Вернуться на верх