首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django Profiles的挑战

Django Profiles的挑战
EN

Stack Overflow用户
提问于 2020-01-20 09:41:47
回答 2查看 59关注 0票数 0

我的模特如下:

代码语言:javascript
复制
class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    image = models.ImageField(default='default.jpg', upload_to='profile_pics')
    role = models.CharField(max_length=25,choices=role, default='Freelancer')

    def __str__(self):
        return f'{self.user.username} Profile'

我的看法如下:

代码语言:javascript
复制
def profile(request):
    if request.method == 'POST':
        p_form = ProfileUpdateForm(request.POST,
                                   request.FILES,
                                   instance=request.user.profile)
        if p_form.is_valid():
            p_form.save()
            messages.success(request, f'Your account has been updated!')
            return redirect('profile')

    else:
        p_form = ProfileUpdateForm(instance=request.user.profile)

    context = {
        'p_form': p_form
    }

    return render(request, 'profile.html', context)

我的信号文件如下:

代码语言:javascript
复制
@receiver(post_save, sender=settings.AUTH_USER_MODEL)
def create_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)
        profile.save()


@receiver(post_save, sender=User)
def save_profile(sender, instance, **kwargs):
    instance.profile.save()

但是,当我尝试创建一个新用户时,配置文件不会被创建,我在/ profile / user没有配置文件时得到了RelatedObjectDoesNotExist。

我不知道为什么这不管用。我还必须指出,我正在使用Django来验证我的身份。

EN

回答 2

Stack Overflow用户

发布于 2020-01-20 09:46:38

在您是信号中,您已经在使用create,然后无缘无故地再次使用save

试试这个:

代码语言:javascript
复制
from django.db.models.signals import post_save

def create_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)
post_save.connect(create_profile, sender=User)

不需要两个信号来从用户保存相同的传入实例,上面的代码将在创建Profile对象时创建一个User对象。

票数 0
EN

Stack Overflow用户

发布于 2020-01-20 10:52:59

我怀疑你的信号没有加载,所以没有呼叫。来自文档

在实践中,信号处理程序通常定义在与其相关的应用程序的信号子模块中。信号接收器连接在应用程序配置类的ready()方法中。如果您使用的是接收器()装饰器,请将信号子模块导入ready()中。

所以在你的apps.py中做这样的事情

代码语言:javascript
复制
#apps.py

class MyappConfig(AppConfig):

    name = 'myapp'

    def ready(self):
        from . import signals

其次,确保正在使用AppConfig。因此,在您的settings.py中,在INSTALLED_APPS部件中,这样调用您的应用程序:

代码语言:javascript
复制
# settings.py

INSTALLED_APPS = [
    myapp.apps.MyappConfig
    # ...
]

还有两点意见:

在您发布的代码中,profile.save()应引发异常,因为未定义配置文件。然而,正如@ans2human所指出的,这一声明并不是必需的。

在您的配置文件中,角色的选择与角色的名称相同。这在我看来很奇怪。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59820521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档