在用户模型的post_save信号上创建用户配置文件

时间:2016-12-28 07:10:03

标签: django django-models django-allauth django-signals

我有UserProfile模型,只要使用post_save信号创建User,我就会实例化一切,除了userprofile中的ImageField之外,一切正常。我正在使用django-allauth进行注册和登录。当我尝试访问任何用户的个人资料页面时,控制台会重复打印:

[28/Dec/2016 12:22:06] "GET /media/C%3A/Users/shagu/Desktop/zorion-develop/project_1
/media/profile/images/Users/shagu/Desktop/zorion-develop/project_1/media/profile/images/...

并说这是结束

    ../zorion-develop/project_1/media/profile/images/nobody.jpg HTTP/1.1" 302 0
[28/Dec/2016 12:24:26] code 414, message Request-URI Too Long
[28/Dec/2016 12:24:26] "" 414 -

配置文件模型如下:

class UserProfile(models.Model):
    user = models.OneToOneField(User, null=True, blank=True, on_delete=models.CASCADE)
    image = models.ImageField(width_field="width_field",
                              height_field="height_field",
                              upload_to=os.path.join(settings.MEDIA_ROOT,'media', 'profile','images'),
                              default = os.path.join(settings.MEDIA_ROOT,'media', 'profile','images', 'nobody.jpg'),
                              )
    height_field = models.IntegerField(default=0)
    width_field = models.IntegerField(default=0)
    age = models.IntegerField(null=True, blank=True)
    gender = models.CharField(
        choices=(
            ('M', 'male'),
            ('F', 'female'),
        ),
        default='M', max_length=1)
    profile_confirmed = models.BooleanField(default=False)

与媒体相关的设置如下:

MEDIA_ROOT = os.path.join(os.path.dirname(PROJECT_ROOT))
MEDIA_URL = "/media/"

这就是我尝试访问模板中图像的方式:

<div align="center"><img alt="User Pic" src="{{ user.userprofile.image.url }}" id="profile-image1" class="img-circle img-responsive">

我是django的新手。请让我知道我搞砸了。

1 个答案:

答案 0 :(得分:0)

完全理解并修复问题所需的信息少得多,但我可以给你一个可能会修复它的提示。

首先,您当前状态的MEDIA_ROOT指向项目之外,因为PROJECT_ROOT可能类似于'/ home / user / myproject',而MEDIA_ROOT将是'/ home / user'。无论如何,如果你真的想要的话,这很好。但实际上我会把它改为:

MEDIA_ROOT = os.path.join(PROJECT_ROOT, 'media')

其次,在

中使用绝对路径
upload_to=os.path.join(settings.MEDIA_ROOT,'media', 'profile','images')

实际上并不是一个好习惯。您应该使用相对路径,Django实际上将相对于MEDIA_ROOT和MEDIA_URL构建正确的路径(并在将来链接)。像这样:

upload_to=os.path.join('', 'profile','images')

在你做了假设的修复之后,为你的图像字段上传一个新的文件/图像,因为我认为Django已经以错误的方式在你的数据库中存储链接,并强烈建议进行干净的测试。