我试图在创建用户时向用户添加个人资料图片但是在我尝试登录时创建用户时我得到
User has no profile
,即使我尝试使用超级用户登录Django admin。这个错误是由signals.py文件中的instance.profile.save()
引起的
这是我的 signals.py:
from django.contrib.auth import get_user_model
from django.db.models.signals import post_save
from django.dispatch import receiver
from .models import Profile
User = get_user_model()
@receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
print('inside signals')
print(created)
if created:
Profile.objects.create(user=instance)
@receiver(post_save, sender=User)
def create_profile(sender, instance, **kwargs):
print('inside profile create')
instance.profile.save()
这是我的个人资料模型:
from django.db import models
from django.conf import settings
# Create your models here.
User = settings.AUTH_USER_MODEL
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
image = models.ImageField(default='default.jpg', upload_to='profile_pics')
def __str__(self):
return f"{self.user.username} Profile"
这是我的注册视图:
User = get_user_model()
def register_view(request):
form = RegisterForm(request.POST or None)
if form.is_valid():
username = form.cleaned_data.get('username')
email = form.cleaned_data.get('email')
password = form.cleaned_data.get('password1')
password2 = form.cleaned_data.get('password2')
try:
user = User.objects.create_user(username, email, password)
except:
user = None
if user != None:
# request.user == user
# login(request, user)
return redirect('login')
else:
request.session['register_error'] = 1
return render(request, "recipe/forms.html", {'form': form, 'title': 'Join Today'})
编辑:这是apps.py
from django.apps import AppConfig
class AccountsConfig(AppConfig):
name = 'accounts'
def ready(self):
print('inside app')
import accounts.signals
我确实在 apps.py 下导入了
accounts.signals
就绪功能,我确实在 accounts.apps.AccountsConfig
下有INSTALLED_APPS
.
注释掉
instance.profile.save()
将允许我登录到 Django 管理,在那里我可以看到用户是通过我的注册视图创建的,但没有创建配置文件。
我知道这个问题有一段时间了。但是我遇到了同样的问题,然后找出使用
get_user_model()
不会触发信号的原因。
get_user_model()
会在第一次导入signal函数的时候尝试获取用户模型类,也就是默认定义的User
模型。
def get_user_model():
"""
Return the User model that is active in this project.
"""
try:
return django_apps.get_model(settings.AUTH_USER_MODEL, require_ready=False)
except ValueError:
raise ImproperlyConfigured(
"AUTH_USER_MODEL must be of the form 'app_label.model_name'"
)
except LookupError:
raise ImproperlyConfigured(
"AUTH_USER_MODEL refers to model '%s' that has not been installed"
% settings.AUTH_USER_MODEL
)
对于信号函数收听正确的用户模型,
settings.AUTH_USER_MODEL
必须用作发送者。这是示例代码:
from django.contrib.auth import get_user_model
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.conf import settings
@receiver(post_save, sender=settings.AUTH_USER_MODEL, dispatch_uid="post_save_user_that_works")
def post_save_user(sender, instance, created, **kwargs):
if created:
print("This will work")
@receiver(post_save, sender=get_user_model(), dispatch_uid="post_save_user_that_never_work")
def post_save_user(sender, instance, created, **kwargs):
if created:
print("This will not work")