Как выбрать UserProfileInfo пользователя с определенным PrimaryKey - Django
Я использую Django. В моей функции accept_request()
я пытаюсь выбрать профиль пользователя с определенным PrimaryKey. Вот функция:
def accept_request(request, pk):
book = Book.objects.get(id=pk)
print(book.owner.pk)
user = request.user
user_email = request.user.email
owner_profile = UserProfileInfo.objects.get(user=book.owner.pk)
owner_house_number = owner_profile.house_number
owner_phone_number = owner_profile.phone_number
owner_full_name = owner_profile.full_name
r = UserRents.objects.get(book_id=pk)
r.status = 1
r.save()
subject = "{}, your request to rent the book, \"{}\", has been accepted.".format(user, book)
body = "You had requested to rent the book, \"{}\". It's been accepted! You can head over to #{} to get the book. You can contact the owner, {}, at +91 {}. Please return the book in the same condition as it was when you got it.\n Hope you enjoy reading the book!".format(book, owner_house_number, owner_full_name, owner_phone_number)
sender_email = "pfcbookclub@gmail.com"
receiver_email = user_email
password = "Zt2.~[3d*.[Y5&5r"
# Create a multipart message and set headers
message = MIMEMultipart()
message["From"] = sender_email
message["To"] = receiver_email
message["Subject"] = subject
message["Bcc"] = receiver_email # Recommended for mass emails
# Add body to email
message.attach(MIMEText(body, "plain"))
text = message.as_string()
# Log in to server using secure context and send email
context = ssl.create_default_context()
with smtplib.SMTP_SSL("smtp.gmail.com", 465, context=context) as server:
server.login(sender_email, password)
server.sendmail(sender_email, receiver_email, text)
return redirect("/")
Это модель UserProfileInfo
в models.py
:
class UserProfileInfo(models.Model):
user = models.OneToOneField(User,on_delete=models.CASCADE)
full_name = models.CharField(max_length=1000, blank=True)
house_number = models.CharField(max_length=5, blank=True)
email = EmailField(max_length=1000, blank=True)
creation_date = models.DateTimeField(default=timezone.now)
phone_number = models.CharField(max_length=20, blank=True, null=True)
def __str__(self):
return self.user.username
А вот модель Book
в models.py
:
class Book(models.Model):
title = models.CharField(max_length=1000, blank=True)
owner = models.ForeignKey(User, on_delete=models.CASCADE, blank=True, null=True)
description = models.TextField()
author = models.CharField(max_length=1000, blank=True, null=True)
thumbnail = models.ImageField(upload_to='book_thumbnails', blank=True)
creation_date = models.DateTimeField(default=timezone.now)
status = IntegerField(default=1)
min_age = models.IntegerField(blank=True, null=True)
max_age = models.IntegerField(blank=True, null=True)
def __str__(self):
return self.title
Когда я перехожу на URL, который я исправил для этой функции, он выдает ошибку:
DoesNotExist at /main/accept_rent_request/1/
UserProfileInfo matching query does not exist.
Ошибка в строке, где я пытаюсь получить доступ к UserProfileInfo
владельцу книги:
owner_profile = UserProfileInfo.objects.get(user=book.owner.pk)
Django не может получить доступ к профилю владельца. Что я могу сделать, чтобы решить эту проблему?
Во-первых, вы можете получить доступ к информации о профиле пользователя, выполнив
owner_profile = book.owner.userprofileinfo
Кроме того, ошибка связана с тем, что ваш UserProfileInfo не существует. Если вы хотите явно запросить его, вы можете сначала проверить, существует ли он, а затем присвоить его owner_profile
user_profile_info_query = UserProfileInfo.objects.filter(user=book.owner)
if user_profile_info_query.exists():
owner_profile = user_profile_info_query.first()
Вы можете создать новый UserProfileInfo в оболочке и назначить пользователя ему, чтобы вы могли проверить.