python - 如何将登录用户的用户名添加到 django 中的模型字段
问题描述
如何将当前登录用户的用户名添加到我的模型中的字段?例如,我需要在模型中存储有关用户的信息,例如姓名、电子邮件等,而不是默认的 Django 用户模型,但我仍然使用默认的一个来存储凭据。我想建立它们之间的关系,所以我username
在我的模型中创建了字段。保存相应表单后如何用当前用户的用户名填写?我的模型
class ApplicantProfile(models.Model):
name = models.CharField(max_length = 50)
dob = models.DateField()
email = models.EmailField()
description = models.TextField()
username = <something>
我<something>
用什么来改变?
我的表格
class ApplicantProfileEdit(forms.ModelForm):
class Meta:
model = ApplicantProfile
fields = [
'name',
'dob',
'email',
'description',
]
我的观点
def ApplEditView(request):
form = ApplicantProfileEdit(request.POST or None)
if form.is_valid():
form.save()
form = ApplicantProfileEdit()
context = {
'form':form
}
return render(request, "applProfileEdit.html", context)
PS我试图将模型直接导入我的views.py
,并在我的视图中分配request.user.username
给username
模型的字段,但它不起作用,只是将该字段留空。username
当CharField
我尝试这个时,我就有了。
解决方案
保存用户名本身不是一个好主意,或者至少不是没有FOREIGN KEY
约束。如果稍后用户更改其名称,则用户名现在指向一个不存在的用户,如果稍后另一个用户将其用户名更改为该用户名,那么您ApplicantProfile
将指向错误的用户。
通常使用一个ForeignKey
字段 [Django-doc],或者如果每个都ApplicantProfile
指向不同的用户,则使用OneToOneField
[Django-doc]:
from django.conf import settings
from django.db import models
class ApplicantProfile(models.Model):
name = models.CharField(max_length = 50)
dob = models.DateField()
email = models.EmailField()
description = models.TextField()
# maybe a OneToOneField
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
在视图中:
from django.contrib.auth.decorators import login_required
from django.shortcuts import redirect
@login_required
def appl_edit_view(request):
if request.method == 'POST':
form = ApplicantProfileEdit(request.POST)
if form.is_valid():
form.instance.user = request.user
form.save()
return redirect('some-view-name')
else:
form = ApplicantProfileEdit()
context = {
'form':form
}
return render(request, 'applProfileEdit.html', context)
注意:如果 POST 请求成功,您应该制作一个
redirect
[Django-doc] 来实现Post/Redirect/Get模式 [wiki]。这样可以避免在用户刷新浏览器时发出相同的 POST 请求。
注意:您可以使用
@login_required
装饰器 [Django-doc]将视图限制为经过身份验证的用户的视图 。
推荐阅读
- react-native - addlistener focus react native 仅适用于第二次刷新 react-native
- java - Java GET HTTP openConnection() 未正确编码 JSON 输出字符串
- amazon-cognito - 如何仅使用 auth 包配置 Amplify?
- sql - 如何将返回值从一个 PostgreSQL 查询传递到另一个?
- openwhisk - 什么是 OpenWhisk“集合”?
- python - 在字典值中解包元组
- azure-sql - 运行引用凭据的 Add-AzSqlElasticJobStep 错误
- python-3.x - 字符串列表到整数列表中
- android-jetpack-compose - Jetpack Compose - 滚动到列中的重点可组合
- ffmpeg - 将一堆 .pkl 文件合并为一个,然后转换为 .fbx(在 Windows 上)