python - 当用户新注册时,我对创建用户个人资料感到困惑
问题描述
视图.py
def register_view(request):
if request.method == 'POST':
form = UserForm(request.POST)
if form.is_valid():
user = form.save()
## login(request,user)
messages.success(request,'Account created succcessfully')
return redirect('login')
else:
messages.error(request,'Invalid information! Please retry!')
else:
form = UserForm()
context = {'form':form}
return render(request,'register.html',context)
def login_view(request):
if request.method == 'POST':
form = AuthenticationForm(data=request.POST)
if form.is_valid():
username = form.cleaned_data.get('username')
password = form.cleaned_data.get('password')
user = authenticate(username=username,password=password)
if user is not None:
login(request,user)
return redirect('homepage')
else:
messages.error(request,'No current user!')
else:
form = AuthenticationForm()
context = {'form':form}
return render(request,'login.html',context)
def logout_view(request):
logout(request)
return redirect('login')
@login_required
def profile(request):
Profile.objects.get_or_create(user=request.user)
if request.method == 'POST':
u_form = UserUpdateForm(request.POST,instance=request.user)
p_form = ProfileForm(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,'Profile updated successfully!')
return redirect('profile')
else:
u_form = UserUpdateForm(instance=request.user)
p_form = ProfileForm(instance=request.user.profile)
context = {
## 'user':request.user,
'u_form':u_form,
'p_form':p_form,
}
return render(request,'profile.html',context)
信号.py
@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, instance, **kwargs):
instance.profile.save()
模型.py
class Profile(models.Model):
name = models.OneToOneField(User,on_delete=models.CASCADE)
mobile = models.IntegerField(null=True)
address = models.CharField(max_length=350,null=True)
image = models.ImageField(upload_to='profile_pics', default='default.png',null=True)
def __str__(self):
return str(self.name.username)+'\'s Profile'
表格.py
class UserUpdateForm(forms.ModelForm):
email = forms.EmailField()
class Meta:
model = User
fields = ['username', 'email']
class ProfileForm(forms.ModelForm):
class Meta:
model = Profile
fields = ['mobile', 'address', 'image']
错误信息:
RelatedObjectDoesNotExist at /login/
User has no profile.
我面临一个问题,即尽管我使用了配置文件模型的信号,但无法创建或更新用户配置文件。当我登录注册用户时,错误消息告诉我用户没有个人资料。但是,如果我登录已创建配置文件的用户,它可以显示相关信息,因此对于新注册的用户如何自动为该用户创建配置文件?
解决方案
因为您有一个没有任何配置文件的现有用户,因为没有加载信号,所以如果它是超级用户,则创建该用户从终端创建新的超级用户顺便删除在管理面板登录后没有配置文件的现有用户我也在为我的网络使用信号这是我如何使用它的代码
我的模型.py
from django.db import models
from django.contrib.auth.models import User
from django.utils import timezone
from django.db.models.signals import post_save
from django.dispatch import receiver
class Profile(models.Model):
user = models.OneToOneField(User ,on_delete=models.CASCADE,)
profile_pic = models.ImageField(upload_to='profile_pics', default='default.png',)
first_name = models.CharField(max_length=50, blank=True)
last_name = models.CharField(max_length=75, blank=True)
dob = models.DateField(blank=True, null=True)
joined_date = models.DateTimeField(default=timezone.now,editable=False)
update_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.user.username
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, *args, **kwargs):
if created:
Profile.objects.create(user=instance)
@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
instance.profile.save()
告诉我你是否还有错误
推荐阅读
- react-native - 如何在 React Native 中使用多个 TextInput 进行验证而不使用任何外部 3rd 方包
- c# - WCF 服务无法访问 SQL Server 数据库,而控制台项目可以
- typescript - 打字稿:类返回编号而不是对象实例
- sharepoint - 如果我拥有的 id 是 onedrive/sharepoint 的文件或文件夹,是否有任何休息端点可以找到?
- devops - 带有 Lets Encrypt SSL 的 nginx 入口控制器
- python - Visual Studio 中的 Discord 和 Python 问题
- swift - 存储类型到函数参数
- angular - 如何在角度形式中使用primeng自动完成(如何在形式JSON中使用completeMethod事件)
- git - 有没有办法将多个测试分支名称与 AWS ALB 目标组联系起来?
- linux - 如何为 Linux (Arch) 手动安装旧版本的 unity (2019)