当我尝试同时创建用户和配置文件时,配置文件模型数据不会保存



当我尝试创建一个新用户时,我也想同时创建他们的配置文件。但是没有来自配置文件表单的数据。创建了用户,但在配置文件创建表单中我遇到了一个错误。这是我的型号.py

class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
StudentID = models.IntegerField(primary_key=True, verbose_name='SID')
image = models.ImageField(default='default.jpeg', upload_to='profile_pics', blank=True)
def __str__(self):
return self.Branch
def save(self, *args, **kwargs):
super(Profile, self).save(*args, **kwargs)
img = Image.open(self.image.path)
if img.height > 300 or img.width > 300:
output_size = (300, 300)
img.thumbnail(output_size)
img.save(self.image.path)

forms.py

class UserRegisterForm(UserCreationForm):
email = forms.EmailField()
first_name = forms.CharField()
last_name = forms.CharField()
class Meta:
model = User
fields = ['username', 'email', 'first_name', 'last_name', 'password1', 'password2']
class ProfileCreationForm(forms.ModelForm):
class Meta:
model = Profile
fields = ['StudentID', 'Branch', 'YearOfStudy', 'ContactNumber']

视图.py当我尝试打印StudentID时,会得到None值。我认为数据丢失了。

def register(request):
print("hello")
if request.method == 'POST':
form = UserRegisterForm(request.POST)
form1 = ProfileCreationForm(request.POST)
if form.is_valid() and form1.is_valid():
user = form.cleaned_data.get('username')
StudentID = form.cleaned_data.get('StudentID')
print(StudentID)
profile = form1.save(commit=False)
profile.user = user
form.save()
profile.save()
messages.success(request, f'Your account has been created! You are now able to log in')
print("reached here")
return redirect('login')
else:
form = UserRegisterForm()
form1 = ProfileCreationForm()
context = {
'form': form,
'form1': form1
}
return render(request, 'user/register.html', context)

register.html

{% block content %}
<div class="content-section">
<form method="POST">
{% csrf_token %}
<fieldset class="form-group">
<legend class="border-bottom mb-4">JOIN TODAY</legend>
{{ form|crispy }}
{{ form1|crispy }}
</fieldset>
<div class="form-group">
<button class="btn btn-outline-info" type="submit">Sign Up</button>
</div>
</form>
<div class="border-top pt-3">
<small class="text-muted">Already have an account?<a class="ml-2" href="{% url 'login' %}">Sign In</a></small>
</div>
</div>
{% endblock content %}

StudentIDform1上,而不是form

StudentID = form1.cleaned_data.get('StudentID')
print(StudentID)

您还应该首先保存User,因为它是Profile型号所需的关系

user = form.save()
profile = form1.save(commit=False)
profile.user = user
profile.save()

除了@Iain指出的之外,我认为在运行is_valid之后,视图中的代码出现了一些问题。试着这样修复它:

if form.is_valid() and form1.is_valid():    
profile = form1.save(commit=False)
user = form.save()
profile.user = user
profile.save()
messages.success(request, 'Your account has been created! You are now able to log in')
return redirect('login')

让我解释一下为什么会出现错误,即profile.userUser实例,而不是字符串。所以放username是行不通的。但是你可以在保存表单时获得user对象。就像user=form.save()一样,所以在profile.user中使用它。

最新更新