Я очень плохо знаком с Django, так что, скорее всего, я здесь упускаю что-то очевидное. У меня есть модель 'Профиль', которая расширяет форму Django 'Модель пользователя. Эта модель предназначена для хранения дополнительных настроек для пользователя, которые должны быть определены при регистрации. Поэтому у меня есть форма регистрации, которую я хочу использовать для сохранения пользователя и профиля. В настоящее время создается пользователь, и создается профиль пользователя, но профиль не заполняется данными POST в форме регистрации. Я использую сигналы, но я, должно быть, где-то упускаю важный компонент.
models.py
class Profile(models.Model):
BUTTON_SIZES = (
('S', 'Small'),
('M', 'Medium'),
('L', 'Large'),
)
COLOUR_OPTIONS = (
('Def', 'Default'),
('Con', 'High Contrast'),
('Pro', 'Protanopia'),
('Deu', 'Deuteranopia'),
('Tri', 'Tritanopia'),
)
user = models.OneToOneField(User, on_delete=models.CASCADE)
teacher = models.BooleanField(default=False)
button_size = models.CharField(max_length=1, choices=BUTTON_SIZES)
colours = models.CharField(max_length=3, choices=COLOUR_OPTIONS)
group = models.ForeignKey(Class, on_delete=models.SET_NULL, null=True, blank=True)
def __str__(self):
return f'{self.user.username} Profile'
forms.py
class UserRegisterForm(UserCreationForm):
BUTTON_SIZES = (
('S', 'Small'),
('M', 'Medium'),
('L', 'Large'),
)
COLOUR_OPTIONS = (
('Def', 'Default'),
('Con', 'High Contrast'),
('Pro', 'Protanopia'),
('Deu', 'Deuteranopia'),
('Tri', 'Tritanopia'),
)
button_size = forms.ChoiceField(choices=BUTTON_SIZES)
teacher = forms.BooleanField(required=False)
colours = forms.ChoiceField(choices=COLOUR_OPTIONS)
# added to UserRegisterForm after creating Class model
group = forms.ModelChoiceField(queryset=Class.objects.all(),required=False)
class Meta:
model = User
fields = ['username', 'password1', 'password2', 'teacher', 'button_size', 'colours', 'group',]
views.py
def register(request):
if request.method =='POST':
form = UserRegisterForm(request.POST)
if form.is_valid():
form.save()
username = form.cleaned_data.get('username')
messages.success(request, f'Account created for {username}!')
return redirect('login')
else:
form = UserRegisterForm()
return render(request, 'AppName/register.html',{
'form': form,
})
signal.py
@receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
print("profile created")
@receiver(post_save, sender=User)
def save_profile(sender, instance, **kwargs):
instance.profile.save()
print(instance)
print(instance.profile)
РЕДАКТИРОВАТЬ: в forms.py I иметь следующий импорт
from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm
from .models import Profile, Class, Simulation
В apps.py у меня есть следующее
from django.apps import AppConfig
class AppnameConfig(AppConfig):
name = 'AppName'
def ready(self):
import AppName.signals
Теперь я заметил, что последняя строка неактивна. Я пытался изменить это, но на самом деле я не знаю, что с ним не так, поэтому я не уверен, что делать.