Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 具有get_absolute_url的NoReverseMatch_Django_Django Models_Django Views - Fatal编程技术网

Django 具有get_absolute_url的NoReverseMatch

Django 具有get_absolute_url的NoReverseMatch,django,django-models,django-views,Django,Django Models,Django Views,我有一个由queryset对象组成的链接列表。单击每个链接应将我带到该对象的详细视图。但我得到了以下错误: NoReverseMatch at/idea\u tracker/shoppinglist/ 找不到“视图.收件人详细信息”的反转视图。“收件人详细信息”不是有效的视图函数或模式名称。 我的模型: class Recipient(models.Model): first_name = models.CharField(max_length=30) last_name = m

我有一个由queryset对象组成的链接列表。单击每个链接应将我带到该对象的详细视图。但我得到了以下错误:

NoReverseMatch at/idea\u tracker/shoppinglist/
找不到“视图.收件人详细信息”的反转视图。“收件人详细信息”不是有效的视图函数或模式名称。

我的模型:

class Recipient(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    birthday = models.CharField(max_length=10, blank=True)
    notes = models.TextField(max_length=255, blank=True)

    def __str__(self):
        return "{} {}".format(self.first_name, self.last_name)

    def get_absolute_url(self):
        return reverse(
            'views.recipient_detail', 
            args=(), 
            kwargs={'recipient_id': str(self.id)}
            )

class Gift(models.Model):
    name = models.CharField(max_length=30, blank=True)
    model_number = models.CharField(max_length=30, blank=True)
    price = models.DecimalField(default=0.00, decimal_places=2, 
max_digits=6)
    recipients = models.ManyToManyField(Recipient, blank=True)
    purchased = models.BooleanField(default=False)

    def __str__(self):
        return "{}".format(self.name)
我的看法:

def shopping_list(request):
    recipients = 
        models.Recipient.objects.prefetch_related('gift_set').\
        all().order_by('last_name')
    gift_list = models.Gift.objects.all()
    total = []

    for y in gift_list:
        total.append(y.price)
        total_price = sum(total)
    return render(request, 'idea_tracker/shoppinglist.html', {
        'recipients': recipients, 
        'total_price': total_price
        })

def recipient_detail(request, pk):
    recipient = get_object_or_404(models.Recipient, pk=pk)
    gift = recipient.gift_set
    return render(request, 'idea_tracker/recipient_detail.html', {
        'recipient': recipient
        })
我的网址:

urlpatterns = [
    url(r'^shoppinglist/', views.shopping_list, name='shopping_list'),
    url(r'^recipient_detail/(?P<recipient_id>)/$', 
         views.recipient_detail, name='recipient_detail'),
]
urlpatterns=[
url(r“^shoppinglist/”,views.shopping\u list,name='shopping\u list'),
url(r“^recipient\u detail/(?P)/$”,
views.recipient\u detail,name='recipient\u detail'),
]
我的模板:

<h3> Click on a Recipient to edit or delete:</h3>

    {% for name in recipients %}

    <ul>
        <li><a href="{{ name.get_absolute_url }}">{{ name.first_name }} 
        {{ name.last_name }} /

        {% for gift in name.gift_set.all %}

         <span style='color:darkblue'>{{ gift }}</span></a></li>

        {% endfor %}

    </ul>

   {% endfor %}
单击收件人以编辑或删除:
{收件人%中的名称为%}
  • {%endfor%}
{%endfor%}
您应该使用url模式的名称
收件人\u详细信息

return reverse(
    'recipient_detail', 
    args=(), 
    kwargs={'recipient_id': str(self.id)}
    )
您的
收件人\u id
组为空。例如,您可以将数字与以下匹配:

url(r'^recipient_detail/(?P<recipient_id>\d+)/$', 
     views.recipient_detail, name='recipient_detail'),
url(r'^recipient\u detail/(?P\d+)/$),
views.recipient\u detail,name='recipient\u detail'),

最后,您应该在
recipient\u detail
视图中将
pk
更改为
recipient\u id
,以匹配URL模式。

我已经生锈,没有设置来验证这一点,但是IIRC URL中的命名捕获组转换为视图的kwarg,但是您的
recipient\u details
函数未设置为使用名为
recipient\u id
的kwarg。作为
def recipient\u detail(请求,收件人id):
maybe?这本身并不能解决问题,但它需要解决,并且是解决方案的一部分。非常感谢。这起作用了。我很好奇为什么用相反的方法将“views.recipient\u detail”改为“recipient\u detail”会奏效?非常感谢你的帮助!获取URL模式名称,在您的示例中,该名称是
'recipient\u detail'
,因为您有
name='recipient\u detail'