【问题标题】:Python: NoReverseMatch error: Reverse for 'detail' with arguments '(UUID)' and keyword arguments '{}' not found. 1 pattern(s) tried: ['']in djangoPython:NoReverseMatch 错误:未找到带有参数“(UUID)”和关键字参数“{}”的“详细信息”的反向。尝试了 1 种模式:['']in django
【发布时间】:2016-11-23 13:38:02
【问题描述】:

我创建了一个模型“Post”,在该模型中我使用 UUID 而不是 Django 内置的自动生成 ID。在“发布”模型中,我定义了一个 def get_absolute_url 以便我可以将它保存在我的模板中。当我试图获取交易页面时,它会引发错误:NoReverseMatch at /deal/ 使用参数“(UUID('086d177f-9071-4548-b5db-1d329078853e'),)”和关键字参数“{}”未找到“详细信息”。尝试了 1 种模式:['deal/(?P\d+)/$']。我会很感激帮助我解决这个问题。

这是我的代码:

模型.py:

class Post(models.Model):
    post_id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    user = models.ForeignKey(settings.AUTH_USER_MODEL, default=1)
    from1 = models.CharField(max_length=20)

    def __str__(self):
        return self.post_id

    def get_absolute_url(self):
        return reverse("detail", args=(self.post_id))

urls.py:

url(r'^deal/$', views.deal, name='deal'),
url(r'^deal/(?P<post_id>\d+)/$', views.post_detail, name='detail'),

Views.py:

def deal(request):
    queryset_list = Post.objects.active() #.order_by("-timestamp")
    if request.user.is_staff or request.user.is_superuser:
        queryset_list = Post.objects.all()
    context = {
        "object_list": queryset_list, 
        "post_id": "List",
    }
    return render(request, 'before_login/deal.html', context)

def post_detail(request, post_id=None):  
    instance = get_object_or_404(Post, post_id=post_id)
    if instance.date > timezone.now().date():
        if not request.user.is_staff or not request.user.is_superuser:
            raise Http404
    share_string = quote_plus(instance.Material_Type)
    context = {
        "from1": instance.from1,
        "instance": instance,
        "share_string": share_string
    }
    return render(request, "loggedin_load/post_detail.html", context)

deal.html:

{% for obj in object_list %}
    <tr>
      <td scope="row">{{obj.post_id}}</td>
      <td> <a href='{{ obj.get_absolute_url }}'>{{ obj.from1 }}</a><br/></td>
      <td>{{obj.user}}</td>
    </tr>
{% endfor %}

【问题讨论】:

  • 在您的交易模板中,您在某处使用了{% url %} 标签。你应该发布那个。
  • get_absolute_url(): args=(self.post_id,) 中缺少逗号。
  • 我更新了我的模板代码。我没有在任何地方使用 {% url %}。
  • @knbk 有效。但是现在,它在 /deal/ Reverse 处显示 NoReverseMatch 以显示带有参数 '(UUID('086d177f-9071-4548-b5db-1d329078853e'),)' 和关键字参数 '{}' 的“细节”。尝试了 1 种模式:['deal/(?P\\d+)/$']。与我在模型中使用 kwargs 而不是 args 时相同。你能解决这个问题吗?

标签: django django-models django-views django-urls


【解决方案1】:

您的 UUID 包含字母和连字符,但您的正则表达式仅匹配数字 (\d+)。您需要更改正则表达式以捕获字母和连字符:

url(r'^deal/(?P<post_id>[\w-]+)/$', views.post_detail, name='detail'),

【讨论】:

    【解决方案2】:

    对于UUID,这里是正则表达式

    url(r'^deal/(?P&lt;pk&gt;[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})/$', views.post_detail, name='detail'),

    【讨论】:

      猜你喜欢
      • 2016-11-16
      • 2019-06-01
      • 1970-01-01
      • 2019-06-03
      • 1970-01-01
      • 2020-11-06
      • 1970-01-01
      • 2015-02-08
      相关资源
      最近更新 更多