删除了模型实例和错误 "NoReversematch"
Removed model instances and error "NoReversematch"
我遇到了类似于此的错误消息 post 。
但是,只有在对我的 Django 模型实例执行以下步骤后,尤其是在管理员中,我才收到此消息。
我有一个模型,叫做“Product”。在管理员中,我创建了该产品的几个实例,每个实例都有一个“id”字段。所以,我有 5 个产品,每个都有“id”、“1”、“2”、“3”、“4”和“5”。
我有一个显示所有“产品”列表的 html 模板,每个产品都有一个 url link:
class Product(models.Model)
...
def get_absolute_url(self):
return reverse('catalog:product_detail',
args=[self.id, self.slug])
这是模板的一部分:
<a href="{{ product.get_absolute_url }}"> </a>
单击此 url 将进入产品详细信息视图,如下所示(在 views.py 中):
def product_detail(request, id, slug):
product = get_object_or_404(Product,
id=id,
slug=slug)
return render(request,
'catalog/product/detail.html',
{'product': product,})
我还创建了一个上下文处理器来跟踪在 context_processors.py
.
中本网站所有模板中创建的产品
现在,当我删除管理中的前几个产品(产品“1”、“2”、“3”),同时在管理中创建新产品(添加“6”、“7” "、"8" 和 "9"),当我重新渲染模板时,出现了这个“NoReverseMatch”错误。
我猜测,由于产品已在管理员中删除,但上下文进程仍保留该产品的记录,因此模板无法再找到反向 url。我如何“重置”这种情况(即重置我的所有产品或上下文处理器)?
我猜你有一个名为 catalog
的应用程序,你在其中定义了 Product
模型
我认为,您甚至不需要 id
,因为 slug
显然必须 unique
(在 Product
模型中)
class Product(models.Model):
"""Model to store Products."""
slug = models.SlugField(_('slug'), max_length=255,
unique=True, null=True, blank=True,
help_text=_(
'If blank, the slug will be generated automatically '
'from the given name.'
)
)
name = models.CharField(_('name'), max_length=255,
unique=True,
help_text=_('The title of the product.')
)
[..]
def save(self, *args, **kwargs):
if not self.slug:
self.slug = slugify(self.name)
super(Product, self).save(*args, **kwargs)
在你的函数中
def product_detail(request, slug):
product = get_object_or_404(Product, slug=slug)
return render(request,
'catalog/product/detail.html',
{'product': product,})
您可以像这样定义您的路线
app_name = 'catalog'
urlpatterns = [
..
path('products/<slug:slug>', views.product_detail, name='product_detail'),
..
]
然后在您的模板中调用 url
<a href="{% url 'catalog:product_detail' slug=product.slug %}"> </a>
我遇到了类似于此的错误消息 post
但是,只有在对我的 Django 模型实例执行以下步骤后,尤其是在管理员中,我才收到此消息。
我有一个模型,叫做“Product”。在管理员中,我创建了该产品的几个实例,每个实例都有一个“id”字段。所以,我有 5 个产品,每个都有“id”、“1”、“2”、“3”、“4”和“5”。
我有一个显示所有“产品”列表的 html 模板,每个产品都有一个 url link:
class Product(models.Model)
...
def get_absolute_url(self):
return reverse('catalog:product_detail',
args=[self.id, self.slug])
这是模板的一部分:
<a href="{{ product.get_absolute_url }}"> </a>
单击此 url 将进入产品详细信息视图,如下所示(在 views.py 中):
def product_detail(request, id, slug):
product = get_object_or_404(Product,
id=id,
slug=slug)
return render(request,
'catalog/product/detail.html',
{'product': product,})
我还创建了一个上下文处理器来跟踪在 context_processors.py
.
现在,当我删除管理中的前几个产品(产品“1”、“2”、“3”),同时在管理中创建新产品(添加“6”、“7” "、"8" 和 "9"),当我重新渲染模板时,出现了这个“NoReverseMatch”错误。
我猜测,由于产品已在管理员中删除,但上下文进程仍保留该产品的记录,因此模板无法再找到反向 url。我如何“重置”这种情况(即重置我的所有产品或上下文处理器)?
我猜你有一个名为 catalog
的应用程序,你在其中定义了 Product
模型
我认为,您甚至不需要 id
,因为 slug
显然必须 unique
(在 Product
模型中)
class Product(models.Model):
"""Model to store Products."""
slug = models.SlugField(_('slug'), max_length=255,
unique=True, null=True, blank=True,
help_text=_(
'If blank, the slug will be generated automatically '
'from the given name.'
)
)
name = models.CharField(_('name'), max_length=255,
unique=True,
help_text=_('The title of the product.')
)
[..]
def save(self, *args, **kwargs):
if not self.slug:
self.slug = slugify(self.name)
super(Product, self).save(*args, **kwargs)
在你的函数中
def product_detail(request, slug):
product = get_object_or_404(Product, slug=slug)
return render(request,
'catalog/product/detail.html',
{'product': product,})
您可以像这样定义您的路线
app_name = 'catalog'
urlpatterns = [
..
path('products/<slug:slug>', views.product_detail, name='product_detail'),
..
]
然后在您的模板中调用 url
<a href="{% url 'catalog:product_detail' slug=product.slug %}"> </a>