django - 在用户注册时填充 UserProfile
问题描述
我正在尝试在用户注册时填充用户个人资料字段(我读过不建议这样做,但我的应用程序需要这样做)
模型.py
class UserProfile(models.Model):
user = models.OneToOneField(User,on_delete=models.CASCADE)
twitter = models.CharField(max_length=50)
def create(sender, **kwargs):
if kwargs['created']:
user_profile = UserProfile.objects.create(user=kwargs['instance'])
post_save.connect(create, sender=User)
视图.py
def register(request):
if request.method == 'POST':
form = RegForm(request.POST)
if form.is_valid():
form.save()
return redirect('/home')
else:
form = RegForm()
args = {'form': form}
return render(request, 'home/registration_form.html', args)
表格.py
class RegForm(UserCreationForm):
email = forms.EmailField(required=True)
username = forms.CharField(max_length=50, required=True)
twitter = forms.CharField(max_length=50, required=True)
class Meta:
model = User
fields = (
'username',
'twitter',
'first_name',
'last_name',
'email',
'password1',
'password2'
)
def save(self, commit=True):
user = super(RegForm, self).save(commit=False)
user.username = self.cleaned_data['username']
user.first_name = self.cleaned_data['first_name']
user.last_name = self.cleaned_data['last_name']
user.email = self.cleaned_data['email']
user.userprofile.twitter = self.cleaned_data['twitter']
if commit:
user.save()
return user
目前,我收到错误“用户没有用户配置文件”
(第一次使用 Django,对不起,如果这是一个愚蠢的问题,我在网上找不到任何帮助)
追溯:
_execute 85 中的文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/backends/utils.py”。返回 self.cursor.execute(sql, params)
执行 298 中的文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/backends/sqlite3/base.py”。返回 Database.Cursor.execute(self,查询,参数)
上述异常(NOT NULL 约束失败:app_userprofile.user_id)是以下异常的直接原因:
内部 34 中的文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/core/handlers/exception.py”。response = get_response(request)
_get_response 126 中的文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/core/handlers/base.py”。response = self.process_exception_by_middleware(e, request)
_get_response 124 中的文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/core/handlers/base.py”。 response = Wrapped_callback(request, *callback_args, ** callback_kwargs)
文件“/Users/IS/Desktop/Project/website/app/views.py”在寄存器 37.form.save()
保存 42.profile.save() 中的文件“/Users/IS/Desktop/Project/website/app/form.py”
保存 718 中的文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/models/base.py”。force_update=force_update, update_fields=update_fields)
save_base 748 中的文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/models/base.py”。更新 = self._save_table(raw, cls, force_insert , force_update, 使用, update_fields)
_save_table 831 中的文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/models/base.py”。结果 = self._do_insert(cls._base_manager,使用, 字段, update_pk, 原始)
_do_insert 869 中的文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/models/base.py”。使用=使用,原始=原始)
manager_method 82中的文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/models/manager.py”。返回getattr(self.get_queryset(),名称) (*args, **kwargs)
_insert 1136 中的文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/models/query.py”。返回 query.get_compiler(using=using).execute_sql (return_id)
execute_sql 1289 中的文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/models/sql/compiler.py”。 cursor.execute(sql, params)
执行 100 中的文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/backends/utils.py”。返回 super().execute(sql, params)
执行 68 中的文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/backends/utils.py”。 return self._execute_with_wrappers(sql, params, many=错误,执行者=self._execute)
_execute_with_wrappers 中的文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/backends/utils.py” 77. return executor(sql, params, many, context)
_execute 85 中的文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/backends/utils.py”。返回 self.cursor.execute(sql, params)
退出89中的文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/utils.py”。 从 exc_value 提高 dj_exc_value.with_traceback(traceback)
_execute 85 中的文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/backends/utils.py”。返回 self.cursor.execute(sql, params)
执行 298 中的文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/backends/sqlite3/base.py”。返回 Database.Cursor.execute(self,查询,参数)
异常类型:/app/register/ 处的 IntegrityError 异常值:NOT NULL 约束失败:app_userprofile.user_id
解决方案
不知道你在哪里读到你不应该这样做;没关系。
由于您正在创建用户,因此您还需要创建用户配置文件。
user = super(RegForm, self).save(commit=False)
profile = UserProfile(user=user, twitter=form.cleaned_data["twitter"]
if commit:
user.save()
profile.save()
但是现在你已经完成了这个,你应该删除那个信号。你不需要它。
请注意,您不需要设置用户名、名字或姓氏,表单会为您设置。
推荐阅读
- odoo - 在 odoo 12 中报告问题
- word2vec - 为什么 Word2Vec 中 model.wv.similarity() 的输出结果与 model.wv.similar() 不同?
- angular - Angular5步进器组件,结合了水平和垂直步骤
- identityserver4 - IdentityServer4 和混合流
- php - Laravel 验证:required_if 中的规则
- ruby-on-rails-5 - 单击“立即入队”时获得“禁止”
- php - 如何在一个请求中返回图像和文本
- android - 如何使用深度链接?
- python - 弹性搜索与 python
- sql - 如何在 Access 查询中显示没有键的记录