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'