如何解决/ profile /中的RelatedObjectDoesNotExist
我正在尝试发送信号,即用户创建了它自动为用户创建配置文件的帐户,但是我认为我在创建signal.py时遇到了麻烦,它注册了用户但未为用户创建配置文件用户
views.py
from django.shortcuts import render,redirect
from django.contrib.auth.decorators import login_required
from .forms import UpdateUserForms,ProfileUpdateForm
from login.forms import UserRegisterForm
from django.contrib import messages
# Create your views here.
@login_required
def profile(request):
if request.method == 'POST':
u_form = UpdateUserForms(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 is updated!')
return redirect('profile')
else:
u_form = UpdateUserForms(instance=request.user)
p_form = ProfileUpdateForm(instance=request.user.profile)
context = {
'u_form': u_form,'p_form': p_form
}
return render(request,'profile.html',context)
def register(request):
form = UserRegisterForm(request.POST)
if form.is_valid():
form.save()
username = form.cleaned_data.get('username')
messages.success(request,f'Account Registeration Successful!!! for { username }')
return redirect('home')
else:
form = UserRegisterForm()
return render(request,'register.html',{'form': form})
signal.py 以便在用户注册后发送信号自动创建用户配置文件
from django.db.models.signals import post_save
from django.contrib.auth.models import User
from django.dispatch import receiver
from .models import Profile
#to create new profile
@receiver (post_save,sender=User)
def create_profile(sender,instance,created,**kwargs):
if created:
Profile.objects.create(user=instance)
#to update profile
@receiver(post_save,sender=User)
def save_profile(sender,**kwargs):
instance.profile.save()
models.py
from django.db import models
from django.contrib.auth.models import User
from PIL import Image
# Create your models here.
class Profile(models.Model):
user = models.OneToOneField(User,on_delete=models.CASCADE)
image = models.ImageField(default='default.jpg',upload_to='profiles')
def __str__(self):
return f'{self.user.username} profile'
def save(self):
super().save() #to save the files comming from parent class
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
from django import forms
from django.contrib.auth.models import User
from .models import Profile
class UpdateUserForms(forms.ModelForm):
email = forms.EmailField()
class Meta:
model = User
fields = ['username','email']
class ProfileUpdateForm(forms.ModelForm):
class Meta:
model = Profile
fields = ['image']
apps.py
from django.apps import AppConfig
class UserConfig(AppConfig):
name = 'user'
def ready(self):
import user.signal
我认为我的signal.py没有发送信号来创建配置文件 而且我对信号发送过程感到困惑
解决方法
尝试一下:
将您的个人档案模型中的保存方法更改为:
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)
将视图中的注册方法更改为:
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'Account Registeration Successful!!! for { username }')
return redirect('home')
else:
form = UserRegisterForm()
return render(request,'register.html',{'form':form})
将您的信号(保留导入)更改为:
@receiver(post_save,sender = User)
def create_profile(sender,instance,created,**kwargs):
if created:
Profile.objects.create(user = instance)
@receiver(post_save,sender = User)
def save_profile(sender,**kwargs):
instance.profile.save()
将您的应用更改为:
from django.apps import AppConfig
class UsersConfig(AppConfig):
name = 'user'
def ready(self):
import user.signals
将users.apps.UsersConfig添加到您的INSTALLED_APPS。
此外,您还应该将UpdateUserForms
重命名为UserUpdateForm
,并将signal.py
重命名为signals.py
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。