【问题标题】:Django how to use generic view with UUID instead of PKDjango如何使用带有UUID而不是PK的通用视图
【发布时间】:2018-12-30 09:14:15
【问题描述】:

我正在尝试访问类似于

的网址

127.0.0.1:8000/posti/qNwEXBxXQdGI4KlQfoHWOA

但是我无法解析该 smalluuid。

这是错误:

NoReverseMatch at /posti/ Reverse for 'detail' with arguments '(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 %}

我在 DetailView 类中添加了slug_url_kwarg = 'uuid',现在它可以工作了,但是现在我有了一个

AttributeError at /posti/qNwEXBxXQdGI4KlQfoHWOA/ 通用详细视图 必须使用对象 pk 或 slug 调用 DetailView。

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

【问题讨论】:

    标签: django


    【解决方案1】:

    我在 DetailView 类中添加了slug_url_kwarg = 'uuid',现在它可以工作了,但是现在我有了一个

    AttributeError at /posti/qNwEXBxXQdGI4KlQfoHWOA/ 通用详细视图 DetailView 必须使用对象 pk 或 slug 调用。

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

    详情请看这里的 Django 源代码 - https://github.com/django/django/blob/master/django/views/generic/detail.py#L8

    【讨论】:

    • 对。我读了一个例子,上面写着“slug”,我认为应该这样称呼它。
    猜你喜欢
    • 1970-01-01
    • 2019-03-27
    • 2021-04-26
    • 2022-12-16
    • 1970-01-01
    • 2020-11-24
    • 2020-12-26
    • 2020-06-17
    • 2012-11-06
    相关资源
    最近更新 更多