在Django上自定义用户模型上的DetailView不起作用

时间:2019-03-25 16:17:31

标签: django django-models django-views

我在我的网站上具有指向“我的帐户”的链接

      {% 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是当前登录用户的ID,因为该用户登录request.user.id在此行<a class="nav-link" href="{% url 'user_detail' id=request.user.id %}">My Account</a>上未返回任何空值。

我无法使用django提供的错误消息找到错误。有人帮我

3 个答案:

答案 0 :(得分:0)

默认情况下,DetailView的URL模式查找名为pk的ID字段。

您可以将网址格式更改为: 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'

答案 1 :(得分:0)

从Django文档中:

链接:https://docs.djangoproject.com/en/2.1/topics/class-based-views/generic-display/

  

此处的URLconf使用命名的组pk-该名称是> DetailView用于查找用于过滤查询集的主键值的默认名称。

     

如果您想给该群组打电话,可以在>视图上设置pk_url_kwarg。可以在DetailView的参考中找到更多详细信息

答案 2 :(得分:0)

我进行了以下更改,现在一切正常!

views.py

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

主页上的“ 我的帐户”链接已更改为

{% 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 })