Регистрация пользователя полностью не работает в Django - PullRequest
1 голос
/ 06 августа 2020

Я создаю приложение Django с формой регистрации. Для этого я добавляю в свою модель дополнительные поля, например:

models.py

class studentInfo(models.Model):
    user = models.OneToOneField(User, null=True, on_delete=models.CASCADE, related_name="student")
    student_id = models.IntegerField(primary_key=True, null=False, validators=[MaxValueValidator(99999),
                    MinValueValidator(10000)])
    major = models.CharField(max_length=500,null=True, blank=False, default= '------')

И мой forms.py

class UserReg(UserCreationForm):
    class Meta:
        model = User
        fields = ('username', 'email')

class StudentReg(forms.ModelForm):
    class Meta:
        model = studentInfo
        fields = ('student_id', 'phone', 'major', 'eof', 'arc')

А вот и мой views.py (Это определенно неверно, но я хочу добавить его, чтобы показать, что я пробовал)

def signup(request):
    print("in view")
    if request.POST:
        print("in post")
        userF = UserReg(request.POST)
        studF = StudentReg(request.POST)
        if userF.is_valid():
            userF.save()
            userInst = User.objects.get(username = userF.cleaned_data['username'])
            print(userInst.username)
            if studF.is_valid():
  
                studF.save()
                studInst = studentInfo.objects.get(studentInfo__student_id = studF.cleaned_data['student_id'])
                studInst.user = userInst
                studInst.save()
                return redirect('login')

        else:
            print('in the user invalid')
            print(userF.is_valid())
    else:
        userF = UserReg(request.POST)
        studF = StudentReg(request.POST)

    context = {'user':userF, 'student':studF}

    return render(request,'accounts/signup.html', context)

РЕДАКТИРОВАТЬ: Вот файл сигналов signals.py

@receiver(post_save, sender=User)
def create_student(sender, instance, created, **kwargs):

    
    if created:
        studentInfo.objects.create(user=instance)

signup.html - отображение формы здесь

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Signup Student</title>

    <body>
        <h1>Form goes here</h1>

        <form method = "POST" action="">
            {% csrf_token %}
            {{ userF.as_p }}
            {{ studF.as_p }}
            
            <input type="submit" value="save" />
        </form>

        
    </body>
</head>
<body>
    
</body>
</html>

Проблема, с которой я столкнулся, заключается в том, что Django создает пользователя, но не создает ученика. Для создания объекта ученика требуется создать уже существующего пользователя. Есть ли способ проверить обе формы и создать пользователя и учащегося при нажатии кнопки отправки?

Ответы [ 2 ]

1 голос
/ 06 августа 2020

Вам больше не нужен сигнал. получить идентификатор сохраненного пользователя, затем добавить commit = false, чтобы добавить идентификатор пользователя в форму.

def signup(request):
    print("in view")
    if request.POST:
        print("in post")
        userF = UserReg(request.POST)
        studF = StudentReg(request.POST)
        if userF.is_valid():
            userF.save()
            if studF.is_valid():
                student_f = studF.save(commit=False)
                studfF.user = userF.id      
                studF.save() 
                return redirect('login') 
1 голос
/ 06 августа 2020

Вы пытаетесь подключить сигналы в незагруженном файле. Довольно простое решение - удалить декоратор @receiver и использовать signals.py как функциональный модуль. Однако вам нужно будет выполнить некоторые действия в apps.py.

class YourAppConfig(AppConfig):
    name = 'name'
    verbose_name = 'verbose' # regular stuff

    def ready(self):
        # importing inside ready because apps are not loaded before that moment
        from django.contrib.auth.models import User
        from django.db.models.signals import post_save
        from .signals import create_student

        post_save.connect(create_student, sender=User)

И ваш signals.py должен выглядеть так:

def create_student(sender, instance, created, **kwargs):

    if created:
        studentInfo.objects.create(user=instance)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...