Django如何通过UUID而不是PK使用通用视图

时间:2018-07-22 23:12:41

标签: django

我正在尝试访问一个类似于

的网址

127.0.0.1:8000/posti/qNwEXBxXQdGI4KlQfoHWOA

但是我无法解决这个问题。

这是错误:

  

在/ posti /处NoReverseMatch反转带参数的'detail'   找不到'(SmallUUID('qNwEXBxXQdGI4KlQfoHWOA'),)'。 1个图案   尝试过的:['posti /(?P [0-9a-fA-F-] +)/ $']

Django在尝试使用另一个具有以下字符串的视图中解决该问题时遇到问题:

from . import views
from django.conf.urls import url


app_name = 'posti'

urlpatterns = [
    url(r'^$', views.IndexView.as_view(), name='index'),
    url(r'^(?P<slug>[0-9a-fA-F-]+)/$', views.DetailView.as_view(), name='detail'),

我的DetailView是这个:

class DetailView(generic.DetailView):
    model = Post
    template_name = 'posti/detail.html'
    slug_field = 'uuid'



    def get_queryset(self):
        """
        Excludes any questions that aren't published yet.
        """
        return Post.objects.all()

我尝试重写get_object,但是它什么也没做。我不知道正则表达式是否有误或我的观点有误。

编辑:

我的索引模板引发了以上错误,并且具有以下代码:

{% if posti_list != null %}
    <ul>
    {% for post in posti_list %}
        <li><a href="{% url 'posti:detail' post.uuid %}">{{ post.title }}</a></li>
    {% endfor %}
    </ul>
{% else %}
    <p>No posts are available.</p>
{% endif %}

我将slug_url_kwarg = 'uuid'添加到了DetailView类中,但是现在有了

,它现在可以工作了
  / posti / qNwEXBxXQdGI4KlQfoHWOA /一般详细信息视图上的

AttributeError   必须使用对象pk或子弹调用DetailView。

当我尝试访问特定帖子时。

1 个答案:

答案 0 :(得分:3)

  

我在DetailView类中添加了slug_url_kwarg = 'uuid',但现在有了一个

     
    

/ posti / qNwEXBxXQdGI4KlQfoHWOA /上的AttributeError通用详细信息视图DetailView必须使用对象pk或子弹调用。

  

slug_url_kwarg必须与您的网址正则表达式组名称(在您的情况下为slug,这是slug_url_kwarg的默认值)相匹配,因此您不应该更改它

有关详细信息,请参见此处的Django源代码-https://github.com/django/django/blob/master/django/views/generic/detail.py#L8