Django 创建双用户
我的代码有一个问题,即当学生注册时,会创建该学生的双实例。我不知道这些代码块有什么问题。请帮忙,我也不知道如何在老师和学生之间建立链接,以便让老师为学生添加结果 views.py models.py forms.py signals.py 学生资料页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
这是因为您正在保存表单.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()