Django 创建双用户

Django 创建双用户,django,python-3.x,Django,Python 3.x,我的代码有一个问题,即当学生注册时,会创建该学生的双实例。我不知道这些代码块有什么问题。请帮忙,我也不知道如何在老师和学生之间建立链接,以便让老师为学生添加结果 views.py models.py forms.py signals.py 学生资料页 这是因为您正在保存表单.save,然后再次保存user.information.save。您需要像这样更改代码: user = form.save() information = a_form.save(commit=False) informat

我的代码有一个问题,即当学生注册时,会创建该学生的双实例。我不知道这些代码块有什么问题。请帮忙,我也不知道如何在老师和学生之间建立链接,以便让老师为学生添加结果

views.py

models.py

forms.py

signals.py

学生资料页


这是因为您正在保存表单.save,然后再次保存user.information.save。您需要像这样更改代码:

user = form.save()
information = a_form.save(commit=False)
information.user = user
information.save()
messages.success(request, 'Your account has been created! You are now able to log in')
return redirect('login')

您可以删除关于user.information的其余代码,也可以删除信号。您不需要信号来创建信息实例,因为您可以使用表单来创建信息实例。

由于创建信息信号,您将获得两个用户实例

user=form.save在下面的代码中将保存一个用户实例

def register(request):
if request.method == 'POST':
    form = UserRegisterForm(request.POST)
    a_form =InformationForm(request.POST)
    if form.is_valid() and a_form.is_valid():
        # form.save() creates a user, and triggers create_information signal
        user = form.save()
        information = a_form.save()
现在,您有了一个信号create_information,它是在保存用户实例后触发的。这个信号是一个信号

您的user=form.save将创建一个用户,并将触发创建_信息信号

这将保存另一个信息实例,并且由于信息模型具有到用户的OneToOne映射,因此还保存了另一个用户实例

旁注:您还保存了三个信息实例。一个是通过create_information signal创建的,一个是通过save_information signal创建的,第三个是通过_form.save方法创建的。如果循环信号被触发,这个数字可能会更多,但不确定,所以你必须自己检查

解决方案:

首先,去掉所有的信号

其次,在保存信息实例之前,将用户添加到该实例中

def register(request):
if request.method == 'POST':
    form = UserRegisterForm(request.POST)
    a_form =InformationForm(request.POST)
    if form.is_valid() and a_form.is_valid():
        user = form.save()
        information = a_form.save(commit=False)
        information.user = user
        information.save()

我也不明白OP对这些信号做了什么,但据我所知,他甚至创造了3个学生的例子,对吧?无论哪种方式,我都对你的答案投了赞成票,因为我有足够的勇气尝试解开这个谜团-所以它被发布到与GET请求相同的视图中。哦,酷,在那些情况下我不知道这一点。谢谢@ruddrayes,这就是为什么我们不先使用commit=False保存它。感谢您的解释。这对于回答我的问题非常有用。我已经让我的视图使用我的表单来保存用户。我认为仍然需要信号。
from django.db.models.signals import post_save
from django.contrib.auth.models import User
from django.dispatch import receiver
from .models import Information

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



@receiver(post_save,sender=User)
def save_information(sender,instance,**kwargs):
    instance.information.save()
{% extends "student/base.html" %}
{% load crispy_forms_tags %}
{% block content %}

    <div class="content-section">
      <div class="media">
        <img class="rounded-circle account-img" src="{{ user.information.image.url }}">
        <div class="media-body">
          <p class="text-secondary">Username: {{ user.username }}</p>
          <p class="text-secondary">First Name: {{ user.first_name }}</p>
          <p class="text-secondary">Last Name: {{ user.last_name }}</p>
          <p class="text-secondary">Email: {{ user.email }}</p>
          <p class="text-secondary">Passport Number: {{ user.information.passport_number }}</p>
          <p class="text-secondary">Date of Birth: {{ user.information.date_of_birth }}</p>
          <p class="text-secondary">Sex: {{ user.information.sex }}</p>
          <p class="text-secondary">Phone Number: {{ user.information.phone_number }}</p>
          <p class="text-secondary">Nationality: {{ user.information.nationality }}</p>
          <p class="text-secondary">Majors: {{ user.information.majors }}</p>
          <p class="text-secondary">Depatrment: {{ user.information.department }}</p>
          <p class="text-secondary">Results: {{ user.information.result }}</p>
          <p class="text-secondary">Years: {{ user.information.years }}</p>
          <p class="text-secondary">Degree: {{ user.information.degree }}</p>
         <a class="btn btn-outline-info" href="{{ user.information.report.url}}">Download your Report</a>
        </div>
      </div>
     {% comment %} <form method="POST">
            {% csrf_token %}
            <fieldset class="form-group" enctype="multipart/form-data">
                <legend class="border-bottom mb-4">Profile Info</legend>
                {{ i_form|crispy }}
                {{ u_form|crispy }}
            </fieldset>
            <div class="form-group">
                <button class="btn btn-outline-info" type="submit">Update</button>
            </div>
        </form>
    </div> {% endcomment %}

{% endblock content %}
user = form.save()
information = a_form.save(commit=False)
information.user = user
information.save()
messages.success(request, 'Your account has been created! You are now able to log in')
return redirect('login')
def register(request):
if request.method == 'POST':
    form = UserRegisterForm(request.POST)
    a_form =InformationForm(request.POST)
    if form.is_valid() and a_form.is_valid():
        # form.save() creates a user, and triggers create_information signal
        user = form.save()
        information = a_form.save()
@receiver(post_save,sender=User)
def create_information(sender,instance,created,**kwargs):
    if created:
        Information.objects.create(user=instance)
def register(request):
if request.method == 'POST':
    form = UserRegisterForm(request.POST)
    a_form =InformationForm(request.POST)
    if form.is_valid() and a_form.is_valid():
        user = form.save()
        information = a_form.save(commit=False)
        information.user = user
        information.save()