Проблемы с Django профилями - PullRequest
       23

Проблемы с Django профилями

0 голосов
/ 20 января 2020

У меня есть мои модели, как показано ниже:

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'

, и мой вид, как показано ниже:

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)

, и мой файл сигналов, как показано ниже:

@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()

Но когда я пытаюсь создать нового пользователя, профиль не создается, и я получаю RelatedObjectDoesNotExist в / profile / У пользователя нет профиля.

Я понятия не имею, почему это не работает. Я должен также упомянуть, что я использую Django Аллах для своей аутентификации

Ответы [ 2 ]

0 голосов
/ 20 января 2020

Я подозреваю, что ваши сигналы не загружены, поэтому они не называются. Из документов :

На практике обработчики сигналов обычно определяются в подмодуле сигналов приложения, к которому они относятся. Приемники сигналов подключаются в метод ready () класса конфигурации вашего приложения. Если вы используете декоратор receive (), импортируйте субмодуль сигналов внутри ready ().

Так что в вашем apps.py сделайте что-то вроде этого

#apps.py

class MyappConfig(AppConfig):

    name = 'myapp'

    def ready(self):
        from . import signals

Во-вторых, сделайте уверен, что AppConfig используется. Так что в вашем settings.py в части INSTALLED_APPS назовите ваше приложение следующим образом:

# settings.py

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

Еще два замечания:

В размещенном вами коде profile.save() должно вызвать исключение, так как профиль не определен. Однако, как указал @ ans2human, это утверждение не требуется.

В вашем профиле выбор роли имеет то же имя, что и роль. Это выглядит странно для меня.

0 голосов
/ 20 января 2020

Если вы Сигнал вы уже используете create, а затем снова используете save без причины.

Попробуйте это:

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.

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