在用户注册时填充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)

view.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)

表格

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中的文件"/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/django/db/backends/utils.py"85.return self.cursor.execute(sql,params)

执行中的文件"/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/django/db/backends/sqlite3/base.py"298.return数据库.光标.执行(self,query,params)

上述异常(NOT NULL约束失败:app_userprofile.user_id)是以下异常的直接原因:

内部文件"/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/django/core/handlers/exception.py"34.response=get_response(request)

_get_response中的文件"/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/django/core/handlers/base.py"126.response=self.process_exception_by_middleware(e,request)

_get_response中的文件"/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/django/core/handlers/base.py"124.response=wrapped_callback(请求,*callback_args,**callback_kwargs)

注册中的文件"/Users/IS/Desktop/Project/website/app/views.py"37.form.save()

保存文件"/Users/IS/Desktop/Project/website/app/form.py"42.profile.save()

保存中的文件"/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/django/db/models/base.py"718.force_update=force_update,update_fields=update_fields)

save_base中的文件"/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/django/db/models/base.py"748.updated=self_save_table(原始、cls、force_insert、force_update、using、update_fields)

_save_table中的文件"/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/django/db/models/base.py"831.result=self_do_insert(cls._base_manager,使用,字段,更新_pk,原始)

_do_insert中的文件"/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/django/db/models/base.py"869.使用=使用,原始=原始)

manager_method中的文件"/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/django/db/models/manager.py"82.返回getattr(self.get_queryset(),name)(*args,**kwargs)

_insert中的文件"/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/django/db/models/query.py"1136.return query.get_compiler(using=using).execute_sql(return_id)

execute_sql中的文件"/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/django/db/models/sql/compiler.py"1289.cursor.execute(sql,params)

执行中的文件"/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/django/db/backends/utils.py"100.return super().execute(sql,params)

执行中的文件"/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/django/db/backends/utils.py"68.回归自我_execute_with_wrappers(sql,params,many=False,executor=self._execute)

_execute_with_wrappers中的文件"/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/django/db/backends/utils.py"77.返回执行器(sql,params,many,context)

_execute中的文件"/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/django/db/backends/utils.py"85.return self.cursor.execute(sql,params)

exit89中的文件"/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/django/db/utils.py"。从exc_value 提高dj_exc_value.with_traceback(回溯)

_execute中的文件"/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/django/db/backends/utils.py"85.return self.cursor.execute(sql,params)

执行中的文件"/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/django/db/backends/sqlite3/base.py"298.return数据库.光标.执行(self,query,params)

异常类型:/app/register处的IntegrityError/异常值:NOT NULL约束失败:app_userprofile.user_id

不确定你在哪里读到不应该这样做;很好。

由于您正在创建User,因此还需要创建UserProfile。

user = super(RegForm, self).save(commit=False)
profile = UserProfile(user=user, twitter=form.cleaned_data["twitter"]
if commit:
user.save()
profile.save()

但现在你已经完成了,你应该删除那个信号。你不需要它。

注意,您不需要设置username、first_name或last_name,表单会为您设置。

最新更新