Почему это работает? Класс Meta, модель = Пользователь

Может кто-нибудь объяснить это? Я нахожусь в процессе попытки создания своего первого проекта после учебника.

Я создал модель Profile с 4 атрибутами (given_name, surname, bio, image). Я создал форму ProfileForm, которая наследуется от UserCreationForm, и я добавил 4 атрибута моей модели в форму как атрибуты формы.

МОЙ ВОПРОС:

Почему это работает только так

class Meta:
   model = User

Это мой файл models.py

class Profile(models.Model):
    given_name = models.CharField(max_length=255)
    surname = models.CharField(max_length=255)
    bio = models.TextField(blank=True, null=True)
    image = models.ImageField(upload_to='uploads/', blank=True, null=True)

    def __str__(self):
        return self.given_name

    class Meta:
        ordering = ['given_name']

Это мой файл forms.py

class ProfileForm(UserCreationForm):
    firstName = forms.CharField(max_length=255)
    lastName = forms.CharField(max_length=255)
    bio = forms.CharField(widget=forms.Textarea)
    image = forms.ImageField()

    class Meta:
        model = User
        fields = ['firstName', 'lastName', 'username', 'password1', 'password2', 'bio', 'image']

Это мой файл views.py

def sign_up_view(request):
    if request.method == "POST": 

        form = ProfileForm(request.POST, request.FILES) 

        if form.is_valid(): 
            user = form.save()
            login(request, user)

            profile = Profile.objects.create(
                given_name=form.cleaned_data['firstName'], 
                surname = form.cleaned_data['lastName'],
                bio = form.cleaned_data['bio'],
                image = form.cleaned_data['image'])

            

            return redirect('home')

    else:
        form = ProfileForm()   

    return render(request, 'core/sign_up.html', {"form": form})

Это моя страница администратора для профиля. Admin Page Created Profile

Это моя страница администратора для пользователя

enter image description here

Примечание: Я смог достичь желаемого результата, но у меня проблемы с пониманием того, как это работает. **Также если я хочу связать модель профиля с пользователем таким образом, что если пользователь будет удален в админке, то соответствующий профиль также будет удален?

Это работает только с model = User, потому что ваши поля, такие как username и т.д., являются полями модели User, а не модели Profile.

Что вы можете сделать, так это обработать представление двумя формами. Таким образом, мы создаем форму для модели Profile, а форму UserCreationForm используем для модели User.

Более того, Profile должен быть связан с моделью пользователя, чтобы было понятно, что Profile принадлежит какому пользователю. Таким образом, мы добавляем ForeignKey с:

from django.conf import settings

class Profile(models.Model):
    # ⋮
    user = models.OneToOneField(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        editable=False
    )

    # ⋮

тогда мы можем определить форму Profile с:

class ProfileForm(forms.ModelForm):

    class Meta:
        model = Profile
        fields = '__all__'

тогда мы можем работать с двумя формами, вид выглядит следующим образом:

from django.contrib.auth.forms import UserCreationForm

def sign_up_view(request):
    if request.method == 'POST':
        user_form = UserCreationForm(request.POST, request.FILES)
        profile_form = ProfileForm(request.POST, request.FILES, prefix='profile')

        if user_form.is_valid() and profile_form.is_valid(): 
            user = form.save()
            profile_form.instance.user = user
            profile_form.save()
            login(request, user)
            return redirect('home')

    else:
        user_form = UserCreationForm()
        profile_form = ProfileForm(prefix='profile')
    context = {'user_form': user_form, 'profile_form': profile_form}
    return render(request, 'core/sign_up.html', context)

и в шаблоне отобразите его с помощью:

<form action="{% url 'name-of-the-signup-view' %}" method="post" enctype="multipart/form-data">
    {% csrf_token %}
    {{ user_form }}
    {{ profile_form }}
</form>

Таким образом, мы используем две формы Django в одной HTML-форме, и префикс ProfileForm для полей ввода дополняем profile.

Вернуться на верх