Django — RelatedObjectDoesNotExist даже после записи значения по умолчанию

#python #django #django-models #django-forms #django-templates

#python #django #django-модели #django-forms #django-шаблоны

Вопрос:

Я расширил модель пользователя по умолчанию с помощью поля «телефон». Я бы хотел, чтобы пользователь обновил свой номер телефона после регистрации. Проблема в том, что для нового созданного пользователя объект ‘phone’ рассматривается как пустой даже после того, как значение по умолчанию было записано в коде. Если я хочу обновить номер телефона через форму — я получаю сообщение об ошибке: RelatedObjectDoesNotExist у пользователя / phone нет профиля.

Когда я проверяю атрибуты пользователя через панель администратора, я вижу, что это поле имеет значение по умолчанию (в моем случае 111), но по какой-то причине, когда я загружаю шаблон, появляется ошибка с пустым объектом.

models.py:

 # extending profile 
class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    phone = models.IntegerField(max_length=12, default=111) 
  

views.py:

 def update_profile(request):
    profile_form = ProfileForm(instance=request.user.profile)
    return render(request, 'phone.html', {

        'profile_form': profile_form
    })
  

phone.html

 <form method="post">
  {% csrf_token %}

  {{ profile_form.as_p }}
  <button type="submit">Save changes</button>
</form>
  

signals.py

 from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    phone = models.IntegerField(max_length=12, default=111)  

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

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

Комментарии:

1. можете ли вы показать, что показывает экземпляр печати? в представлении save_user_profile

2. я не пользователь, если я правильно понял ваш запрос, надеюсь, я это сделал. когда я загружаю шаблон, я получаю это в терминале — django.contrib.auth.models.User.profile. RelatedObjectDoesNotExist: у пользователя нет профиля.

Ответ №1:

Вы можете попытаться проверить пользователя, которого вы получаете, через объект запроса, т.е. request.user и user, существующий в базе данных с профилем. Если они оба одинаковы, вы можете попробовать выполнить следующую команду:

 python manage.py shell
  

Импортируйте модели приложения проекта, над которым вы работаете, и моделируйте запросы в views.py . Это поможет в проверке корректного доступа к данным БД в Django.