使用2个表单正确配置用户注册

时间:2018-01-25 11:40:45

标签: python django

我试图一次提交2个表单,以便在Django中创建我的学生用户。我一直在苦苦挣扎一段时间,但我想我终于要结束如何一次管理2个表单供我的用户注册。但是当我填写数据然后单击注册时,我收到错误:“此字段是必需的。”在我的学生ID字段下。我究竟做错了什么 ?感谢。

class User(AbstractUser):
    pass


class Student(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
    student_ID = models.CharField(unique=True, max_length=14,
                                  validators=[RegexValidator(regex='^.{14}$',
                                                             message='The ID needs to be 14 characters long.')])
    photo = models.ImageField(upload_to='students_images')
    phone = models.CharField(max_length=15, )

    def __str__(self):
        return self.user.username


@receiver(post_save, sender=User)
def create_user_student(sender, instance, created, **kwargs):
    if created:
        Student.objects.create(user=instance)


@receiver(post_save, sender=User)
def save_user_student(sender, instance, **kwargs):
    instance.profile.save()
@csrf_protect
def student_register(request):
    if request.method == 'POST':
        form1 = UserForm(request.POST, prefix="user")
        form2 = StudentForm(request.POST, prefix="profile")
        if form1.is_valid() and form2.is_valid():
            # create initial entry for user
            username = form1.cleaned_data["username"]
            password = form1.cleaned_data["password"]
            new_user = User.objects.create_user(username, password)
            new_user.save()

            # create entry for UserProfile (extension of new_user object)
            profile = form2.save(commit=False)
            profile.user = new_user
            profile.save()
            return HttpResponseRedirect("index")
    else:
        form1 = UserForm(prefix="user")
        form2 = StudentForm(prefix="profile")
    c = {
        'form1': form1,
        'form2': form2,
    }
    return render(request, "student_signup_form.html", c)
 <form method="post">
                        {% csrf_token %}
                        <p style="color:red"> {{ form.username.errors }}</p>
                        {{ form1.as_p }}
                        {{ form2.as_p }}
                        <input type="submit" value="Create the account">
                    </form>

foreach ($my_array as $key => $value) {
    if ($key !== "user3") {
        $sum += $value;
    }
}
echo $sum;

2 个答案:

答案 0 :(得分:1)

首先,如果在模板中使用{%csrf_token%},则不需要@csrf_protect。 其次,您可能需要student_ID,因为您正尝试在仅提供用户的信号中创建配置文件。

您可以像这样更改模型:

<强> models.py

class User(AbstractUser):
    pass


class Student(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
    student_ID = models.CharField(unique=True, max_length=14,
                                  validators=[RegexValidator(regex='^.{14}$', message='The ID needs to be 14 characters long.')], null=True, blank=True, default=None)
    photo = models.ImageField(upload_to='students_images', null=True, blank=True, default=None)
    phone = models.CharField(max_length=15, null=True, blank=True, default=None)

    def __str__(self):
        return self.user.username

<强> views.py

def student_register(request):
    data = dict()
    if request.method == 'POST':
        form1 = UserForm(request.POST)
        form2 = StudentForm(request.POST, request.FILES)
        if form1.is_valid() and form2.is_valid():
            cd1 = form1.cleaned_data
            username = cd1["username"]
            password = cd1["password"]
            new_user = User.objects.create_user(username, password)
            new_user.save()
            cd2 = form2.cleaned_data
            phone = cd2['phone']
            student_ID = cd2['student_ID']
            photo = cd2['photo']
            Student.objects.create(user=new_user, phone=phone, student_ID=student_ID, photo=photo)
            return redirect('index')
    else:
        form1 = UserForm()
        form2 = StudentForm()
    data['form1'] = form1
    data['form2] = form2
    return render(request, "student_signup_form.html", data)

<强>模板

                <form action='' method="POST" enctype="multipart/form-data">
                    {% csrf_token %}
                    <p style="color:red"> {{ form.username.errors }}</p>
                    {{ form1.as_p }}
                    {{ form2.as_p }}
                    <input type="submit" value="Create the account">
                </form>

答案 1 :(得分:0)

您可以通过声明类StudentForm(UserForm)来使StudentForm类成为UserForm的派生类:并只提交一个StudentForm表单

也可以这样做,

#models.py
from django.contrib.auth.models import User

class Student(models.Model):
    user = models.OneToOneField(User)
    student_ID = models.CharField(unique=True, max_length=14,validators=[RegexValidator(regex='^.{14}$',message='The ID needs to be 14 characters long.')])
    photo = models.ImageField(upload_to='students_images')
    phone = models.CharField(max_length=15, )

User.student = property(lambda u: Student.objects.get_or_create(user=u)[0])

#forms.py
class StudentForm(forms.ModelForm):

    class Meta:
        model = Student
        fields = ('student_ID', 'photo', 'phone', )

#views.py
def student_register(request):

    template_name = "student_signup_form.html"
    context = {}
    if request.method == 'POST':)
        form = StudentForm(request.POST, instance=request.user.student)
        if form.is_valid():
            object = request.user.student
            object.student_ID= form.cleaned_data['student_ID']
            object.photo = form.cleaned_data['photo']
            object.phone = form.cleaned_data['phone']
            object.save()
            return HttpResponseRedirect('index')
    else:
        form = StudentForm()

    context['form'] = form
    return render(request, template_name, context)