Попытка прочитать pk из url в django, но получаем ошибку NoReverseMatch на /
Я пытаюсь вставить ссылку в мою панель навигации (header.html - которая включена в мой base.html), которая ведет на профиль пользователя. Для того чтобы предоставить профиль пользователя, который в данный момент вошел в систему, я пытаюсь использовать первичный ключ в url. Однако я получаю следующее сообщение об ошибке: Reverse for 'url' with keyword arguments '{'pk': ''}'' not found. Проверен 1 шаблон(ы): ['profiles/show/(?P[0-9]+)/\Z']
У меня определена модель Profile (показана ниже) с отношением OneToOne к моей модели User.
Я думаю, не пытаюсь ли я разобрать неправильную ссылку pk в моем файле header.html. Если это так, то я думаю, что проблема будет в строке 17 "Show Profile", но может быть и в моем файле view? Что-то определенно идет не так с моим первичным ключом, но я новичок в Django и не могу понять, что именно!
Модель:
class Profile(models.Model): # Get access to create profile by default
MALE = 'M'
FEMALE = 'F'
OTHER = 'O'
UNSPECIFIED = "U"
GENDER_CHOICES = [
(MALE, 'Male'),
(FEMALE, 'Female'),
(OTHER, 'Other'),
(UNSPECIFIED, 'Prefer not to say'),
]
user = models.OneToOneField(User, on_delete=models.CASCADE)
phone_number = models.CharField(verbose_name='Mobile Phone Number', max_length=20)
bio = models.TextField(verbose_name='Bio', max_length=500, blank=True, null=True)
date_of_birth = models.DateField(verbose_name='Date of Birth', blank=True, null=True)
first_name = models.CharField(verbose_name='First Name', max_length=255, blank=True, null=True)
surname = models.CharField(verbose_name='Surname', max_length=255, blank=True, null=True)
gender = models.CharField(verbose_name='Gender', max_length=255, choices=GENDER_CHOICES, blank=True, null=True)
emergency_contact_name = models.CharField(verbose_name='Emergency Contact Name', max_length=255, blank=True, null=True)
emergency_contact_number = models.CharField(verbose_name='Emergency Contact Number', max_length=20, blank=True, null=True)
business = models.ForeignKey(BusinessProfile, null=True, blank=True, on_delete=models.SET_NULL) # This may need to change.
creation_date = models.DateTimeField(auto_now_add=True)
def __str__(self):
return str(self.user)
Вид:
class ShowProfileView(DetailView):
model = Profile
template_name = 'profiles/user_profile.html'
def get_context_data(self, *args, **kwargs):
context = super(ShowProfileView, self).get_context_data(*args, **kwargs)
page_user = get_object_or_404(Profile, id=self.kwargs['pk'])
context["page_user"] = page_user
return context
urls.py:
app_name='profiles'
urlpatterns=[
path('create/', CreateProfileView.as_view(), name='create_profile'),
path('show/<int:pk>/', ShowProfileView.as_view(), name='show_profile'),
]
header.html:
<!DOCTYPE html>
<html lang="en">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
</head>
<div class="header" style="background-color:grey;">
{% block logo %}
<a href='{% url "home" %}' class="logo" style="text-align:left;font-size:30px;">.</a>
{% endblock %}
{% if request.user.is_authenticated %}
<div class="header-right" style="text-align:right;" >
{{ user }}
<a href='{% url "accounts:home" %}'>Account</a>
<a href='{% url "profiles:create_profile" %}'>Create Profile</a>
<a href='{% url "profiles:show_profile" pk=profile.id %}'>Show Profile</a>
<a href='{% url "accounts:logout" %}'>Logout</a>
</div>
{% else %}
<div class="header-right" style="text-align:right;" >
<a href='{% url "accounts:login" %}'>Log in</a>
<a href='{% url "accounts:register" %}'>Create Account</a>
</div>
{% endif %}
</div>
</html>
Я также пробовал вызывать в моем html с pk=object.id, а также несколько других вещей.
Пожалуйста, дайте мне знать, если потребуется дополнительная информация. Заранее большое спасибо!
Попытался получить экземпляр модели профиля для текущего вошедшего пользователя. Получена ошибка "NoReverseMatch at /".
Если вы добавляете заголовок к всем элементам, то это означает, что все представления должны передавать profile
контексту, а не только DetailView
.
Возможен также случай, когда профиль отсутствует, например, если пользователь вышел из системы. Таким образом, вам следует проверить, действительно ли профиль profile
является действительным. Однако вы можете получить профиль для request.user
или user
, так:
<a href='{% url "profiles:show_profile" pk=user.profile.id %}'>Show Profile</a>