Почему сигнал post_save здесь не работает? - PullRequest
0 голосов
/ 16 мая 2019

Я создал сигнал, который создает профиль при создании пользователя. Ранее этот же код работал нормально в других проектах. Здесь я не знаю, что я делаю неправильно, что это не работает и не создает профиль для созданных пользователей. Это сигнал.

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


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

Все операции импорта выполнены правильно, и я импортировал их в свое приложение:

class UsersConfig(AppConfig):
    name = 'users'

    def ready(self):
        import users.signals

В случае, если вы хотите посмотреть модель профиля:

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 "{} Profile".format(self.user.username)

Поскольку я создал сигнал, для всех вновь создаваемых пользователей следует добавить default.jpg в качестве изображения профиля по умолчанию.

Но если я создаю нового пользователя, войдите в систему, затем перейдите на страницу профиля, на которой будет показано что-то вроде этого:

enter image description here

и если я зайду в админ и добавлю эту фотографию профиля вручную, она будет работать нормально И наконец, я добавил следующие настройки в urls.py:

if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL,
                          document_root=settings.MEDIA_ROOT)

Пожалуйста, помогите мне исправить это, это было 3 часа, я попробовал все возможные способы, но не мог заставить это работать. Спасибо за вашу помощь.

редактирование: template

<div class="media">
    <img class="rounded-circle account-img" src="{{ user.profile.image.url }}">
    <div class="media-body">
        <h2 class="account-heading">{{ user.username }}</h2>
        <p class="text-secondary">{{ user.email }}</p>
    </div>
</div>

edit-2: default.jpg добавлено здесь! enter image description here

Ответы [ 2 ]

1 голос
/ 16 мая 2019

src(unknown) происходит, если у вас нет profile, прикрепленного к вашему пользователю. Скорее всего, это означает, что ваши сигналы не срабатывают, потому что они не были загружены, потому что ваше приложение UsersConfig не было загружено в первую очередь.

Есть 2 способа загрузки приложения. Правильный будет:

INSTALLED_APPS = [
# ...
'yourapp.apps.UsersConfig'
]

Другой способ - установить default_app_config = 'yourapp.apps.UsersConfig' в yourapp/__init__.py. Обратите внимание, что больше не рекомендуется для новых приложений.

После этого вы, вероятно, захотите изменить также signals.py - если вы попытаетесь сохранить Users, к которому не подключен 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):
    if hasattr(instance, 'profile'):
        instance.profile.save()
    else:
        Profile.objects.create(user=instance)
0 голосов
/ 16 мая 2019

Добавить метод сохранения внутри Profile Модель:

Первый импорт изображения из PIL

from PIL import Image

Тогда ваша модель профиля будет выглядеть так:

    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 "{} Profile".format(self.user.username)

       def save(self, *args, **kwargs):
          super().save()

           img = Image.open(self.image.path)

           if img.height > 300 or img.width > 300:
               output_size = (300, 300)
               img.thumbnail(output_size)
               img.save(self.image.path)

Вот изображениеразмер уменьшен.Если вам нужно, вы можете использовать иначе, вы можете напрямую сохранить изображение без уменьшения размера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...