Django, как сохранить пользователя и модель, расширенную от пользователя в 1 форме? - PullRequest
0 голосов
/ 17 февраля 2020

Я очень плохо знаком с 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

Теперь я заметил, что последняя строка неактивна. Я пытался изменить это, но на самом деле я не знаю, что с ним не так, поэтому я не уверен, что делать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...