Почему это работает? Класс 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})
Это моя страница администратора для профиля.
Это моя страница администратора для пользователя
Примечание: Я смог достичь желаемого результата, но у меня проблемы с пониманием того, как это работает. **Также если я хочу связать модель профиля с пользователем таким образом, что если пользователь будет удален в админке, то соответствующий профиль также будет удален?
Это работает только с 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
.