问题描述
注册新用户时,可以从“管理”页面中看到该用户已创建。 但是,每当我在导航栏中进入个人资料页面时,都会出现以下错误。
在我在“个人资料”页面上添加功能(删除用户和个人资料的按钮)之前,它实际上是可行的,但我看不到需要页面来解决此错误。
profile.html
{% extends "digitalFarm/base.html" %}
{% load crispy_forms_tags %}
{% block content %}
<div class="content-section">
<div class="media">
<img class="rounded-circle account-img" src="{{ user.profile.image.url }}">
<div class="media-body">
<h2 class="account-heading">{{ user.username }}</h2>
<p class="text-secondary">{{ user.email }}</p>
</div>
</div>
<form method="POST" enctype="multipart/form-data">
{% csrf_token %}
<fieldset class="form-group">
<legend class="boder-bottom mb-4">Profile info</legend>
{{ u_form|crispy }}
{{ p_form|crispy }}
{{ d_form|crispy }}
</fieldset>
<div class="form-group">
<button class="btn btn-outline-info" type="submit">Update Profile</button>
</div>
</form>
<form>
{% csrf_token %}
<fieldset class="form-group">
<legend class="border-bottom mb-4">Delete User Account</legend>
</fieldset>
<div class="form-group">
<button class="btn btn-danger">
<a style="color: white" href="{% url 'profile_confirm_delete' %}">Delete Account</a></button>
</div>
</form>
</div>
{% endblock content %}
views.py
def register(request):
if request.method == 'POST':
form = UserRegisterForm(request.POST)
if form.is_valid():
form.save()
username = form.cleaned_data.get('username')
messages.success(request,f'Your account has been created! You are now able to login')
return redirect('login')
else:
form = UserRegisterForm()
return render(request,'users/register.html',{'form': form})
def profile_confirm_delete(request):
user = request.user
context = {
'user': user
}
return render(request,'users/profile_confirm_delete.html',context)
@login_required
def profile(request):
if request.method == 'DELETE':
print('delete works')
return redirect('digitalFarm-home')
if request.method == 'POST':
u_form = UserUpdateForm(request.POST,instance=request.user)
p_form = ProfileUpdateForm(request.POST,request.FILES,instance=request.user.profile)
if u_form.is_valid() and p_form. is_valid():
u_form.save()
p_form.save()
messages.success(request,f'Your account has been updated!')
return redirect('profile')
else :
u_form = UserUpdateForm(instance=request.user)
p_form = ProfileUpdateForm(instance=request.user.profile)
context = {
'u_form' : u_form,'p_form' : p_form
}
return render(request,'users/profile.html',context)
signals.py
@receiver(post_save,sender=User)
def create_profile(sender,instance,created,**kwargs):
print("INSIDE CREATE_PROFILE")#negative
if created:
print("INSIDE CREATED_PROFILE")#negative
Profile.objects.create(user=instance)
@receiver(post_save,sender=User)
def save_profile(sender,**kwargs): #kwargs= accepts any additional keywords
instance.profile.save()
@receiver(pre_delete,sender=User)
def delete_profile(sender,**kwargs): #kwargs= accepts any additional keywords
instance.profile.delete()
forms.py
class UserRegisterForm(UserCreationForm):
email = forms.EmailField()
class Meta:
model = User
fields = ['username','email','password1','password2']
#Update
class UserUpdateForm(forms.ModelForm):
email = forms.EmailField()
class Meta:
model = User
fields = ['username','email']
class ProfileUpdateForm(forms.ModelForm):
print("INSIDE ProfileUpdateForm")
class Meta:
model = Profile
fields = ['image']
#Delete
class ProfileDeleteForm(forms.ModelForm):
class Meta:
model = Profile
fields = ['image']
class UserDeleteForm(forms.ModelForm):
class Meta:
model = User
fields = [] #Form has only submit button. Empty "fields" list still necessary,though.
解决方法
在signals.py中,我没有看到任何save()指令,您的配置文件实例应该如何进入数据库,数据库配置文件表为空。您需要这样的东西(用于创建):
Profile.objects.create(user=instance).save()
或实际上
profileInstance = Profile.objects.create(user=instance)
profileInstance.initNewProfile() # setup context default values
profileInstance.save()
此外,在删除时,实际上还有一个更好的选项来删除从属实例:ORM级别的CASCADE。必须在类(models.py)中定义