我在我的应用程序上创建了一个用户配置文件部分,当用户在我的注册页面上创建帐户时,我试图实现配置文件的自动创建,但自从我添加了信号和接收功能后,我现在收到以下错误。如果我删除信号中的两个定义,注册表单将再次正常工作,因此信号中的某些内容会导致此失败。
以 10 为基数的 int() 的文字无效:''
这是我的观点.py
from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required
from django.contrib import messages
from users.forms import UserRegisterForm
from django.core.mail import send_mail
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'Your account {username} has been created, you can now login !')
return redirect('login')
else:
form = UserRegisterForm()
messages.warning(request,(form._errors))
return render(request, 'users/register.html', {'form': form})
@login_required
def profile(request):
return render(request, 'users/profile.html')
@login_required
def dashboard(request):
return render(request, 'users/dashboard.html')
信号.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
@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()
回溯
Environment:
Request Method: POST
Request URL: http://127.0.0.1:8000/register/
Django Version: 2.2.9
Python Version: 3.7.3
Installed Applications:
['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'forms.apps.FormsConfig',
'crispy_forms',
'users.apps.UsersConfig',
'points.apps.PointsConfig']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware']
Traceback:
File "C:\Users\rzuchowski\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\core\handlers\exception.py" in inner
34. response = get_response(request)
File "C:\Users\rzuchowski\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\core\handlers\base.py" in _get_response
115. response = self.process_exception_by_middleware(e, request)
File "C:\Users\rzuchowski\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\core\handlers\base.py" in _get_response
113. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\missinglink\users\views.py" in register
12. form.save()
File "C:\Users\rzuchowski\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\contrib\auth\forms.py" in save
130. user.save()
File "C:\Users\rzuchowski\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\contrib\auth\base_user.py" in save
66. super().save(*args, **kwargs)
File "C:\Users\rzuchowski\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\db\models\base.py" in save
741. force_update=force_update, update_fields=update_fields)
File "C:\Users\rzuchowski\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\db\models\base.py" in save_base
790. update_fields=update_fields, raw=raw, using=using,
File "C:\Users\rzuchowski\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\dispatch\dispatcher.py" in send
175. for receiver in self._live_receivers(sender)
File "C:\Users\rzuchowski\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\dispatch\dispatcher.py" in <listcomp>
175. for receiver in self._live_receivers(sender)
File "C:\missinglink\users\signals.py" in create_profile
10. Profile.objects.create(user=instance)
File "C:\Users\rzuchowski\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\db\models\manager.py" in manager_method
82. return getattr(self.get_queryset(), name)(*args, **kwargs)
File "C:\Users\rzuchowski\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\db\models\query.py" in create
422. obj.save(force_insert=True, using=self.db)
File "C:\Users\rzuchowski\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\db\models\base.py" in save
741. force_update=force_update, update_fields=update_fields)
File "C:\Users\rzuchowski\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\db\models\base.py" in save_base
779. force_update, using, update_fields,
File "C:\Users\rzuchowski\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\db\models\base.py" in _save_table
870. result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)
File "C:\Users\rzuchowski\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\db\models\base.py" in _do_insert
908. using=using, raw=raw)
File "C:\Users\rzuchowski\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\db\models\manager.py" in manager_method
82. return getattr(self.get_queryset(), name)(*args, **kwargs)
File "C:\Users\rzuchowski\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\db\models\query.py" in _insert
1186. return query.get_compiler(using=using).execute_sql(return_id)
File "C:\Users\rzuchowski\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\db\models\sql\compiler.py" in execute_sql
1367. for sql, params in self.as_sql():
File "C:\Users\rzuchowski\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\db\models\sql\compiler.py" in as_sql
1311. for obj in self.query.objs
File "C:\Users\rzuchowski\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\db\models\sql\compiler.py" in <listcomp>
1311. for obj in self.query.objs
File "C:\Users\rzuchowski\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\db\models\sql\compiler.py" in <listcomp>
1310. [self.prepare_value(field, self.pre_save_val(field, obj)) for field in fields]
File "C:\Users\rzuchowski\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\db\models\sql\compiler.py" in prepare_value
1251. value = field.get_db_prep_save(value, connection=self.connection)
File "C:\Users\rzuchowski\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\db\models\fields\__init__.py" in get_db_prep_save
793. return self.get_db_prep_value(value, connection=connection, prepared=False)
File "C:\Users\rzuchowski\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\db\models\fields\__init__.py" in get_db_prep_value
788. value = self.get_prep_value(value)
File "C:\Users\rzuchowski\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\db\models\fields\__init__.py" in get_prep_value
1825. return int(value)
Exception Type: ValueError at /register/
Exception Value: invalid literal for int() with base 10: ''
型号
from django.db import models
from django.contrib.auth.models import User
class Profile(models.Model):
user = models.OneToOneField(User, on_delete= models.CASCADE)
image = models.ImageField(default ='default.jpg', upload_to='profile_pics')
grade = models.CharField(max_length = 2, default= "")
bio = models.TextField(max_length = 255, default= "")
teacherpsid = models.CharField(default = "", max_length = 50, unique = True)
def __str__(self):
return f'{self.user.username} Profile'
最佳答案
您的接收者接受了错误的参数:
@receiver(post_save, sender=User)
def create_profile(instance, created, **kwargs): # no sender argument!
if created:
Profile.objects.create(user=instance)
实例已传递给参数 sender
,因此 instance
为空。
请注意,您的第二个接收器每次也会运行,包括创建时(在第一个接收器中添加 else
来执行您想要的操作)。无论如何,这似乎是一个无用的接收器,如果用户更改了,为什么还要保存配置文件呢?无论如何,这种关系都会维持。
关于Django 信号配置文件创建问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59648435/