DetailView на пользовательской модели на Django не работает - PullRequest
0 голосов
/ 25 марта 2019

У меня есть ссылка на "Мой аккаунт" на моем сайте

      {% if user.is_authenticated %}
          <a class="nav-link" href="{% url 'user_detail' id=request.user.id %}">My Account</a>
      {% endif%}

на моем urls.py У меня есть эта строка

url(r'^users/(?P<id>\d+)$', views.UserDetailView.as_view(), name='user_detail'),

views.py

class UserDetailView(DetailView):
   context_object_name = 'es_user'
   model = es_user

models.py

class es_user(models.Model):
   user = models.OneToOneField(User,related_name='es_user', on_delete=models.CASCADE)
   def get_absolute_url(self):
       print("self.user.id=",self.user.id)
       return reverse('user_detail', kwargs={'id': self.user.id })

Но когда я нажимаю на ссылку " Мой аккаунт ", я получаю эту ошибку

AttributeError at /users/3

Generic detail view UserDetailView must be called with either an object pk or a slug in the URLconf.

Здесь 3 - идентификатор пользователя, вошедшего в систему в данный момент, так как пользователь вошел в систему request.user.id в этой строке <a class="nav-link" href="{% url 'user_detail' id=request.user.id %}">My Account</a> не возвращает нулевые значения.

Я не могу найти ошибку, используя сообщение об ошибке от django. кто-нибудь, помогите мне

Ответы [ 3 ]

0 голосов
/ 25 марта 2019

Из документации django:

Ссылка: https://docs.djangoproject.com/en/2.1/topics/class-based-views/generic-display/

URLconf здесь использует именованную группу pk - это имя является именем по умолчанию, которое> DetailView использует для поисказначение первичного ключа, используемого для фильтрации набора запросов.

Если вы хотите вызвать группу как-нибудь еще, вы можете установить pk_url_kwarg в представлении>.Более подробную информацию можно найти в ссылке для DetailView

0 голосов
/ 25 марта 2019

Я внес следующие изменения и теперь все отлично работает!

views.py

class UserDetailView(DetailView):
    context_object_name = 'es_user'
    model = es_user
    pk_url_kwarg = 'id'

На домашней странице ссылка на ' Myучетная запись 'была изменена на

{% if user.is_authenticated %}
       <a class="nav-link" href="{% url 'user_detail' id=request.user.es_user.id %}">My Account</a>
{% endif%}

models.py

class es_user(models.Model):
   user = models.OneToOneField(User,related_name='es_user', on_delete=models.CASCADE)
   def get_absolute_url(self):
       return reverse('user_detail', kwargs={'id': self.pk })
0 голосов
/ 25 марта 2019

По умолчанию шаблон URL для DetailView ищет поле идентификатора с именем pk.

Вы можете изменить шаблон URL на: url(r'^users/(?P<pk>\d+)$', views.UserDetailView.as_view(), name='user_detail'),

... или установите pk_url_kwarg в вашем классе следующим образом:

class UserDetailView(DetailView):
   context_object_name = 'es_user'
   model = es_user
   pk_url_kwarg = 'id'
...