Удалены экземпляры модели и ошибка «NoReversematch». - PullRequest
0 голосов
/ 09 июля 2020

Я получаю сообщение об ошибке, подобное этому сообщению здесь .

Однако я получил это сообщение только после того, как выполнил следующие шаги с экземплярами моей модели django, в частности в админке.

У меня есть модель под названием "Товар". В админке я создаю несколько экземпляров этого продукта, каждый с полем «id». Итак, у меня есть 5 продуктов, каждый с "id", "1", "2", "3", "4" и "5".

У меня есть шаблон html, который отображает список все «продукты», с URL-ссылкой на каждый продукт, заданной следующим образом:

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».

Я предполагаю, что, поскольку продукты удаляются в админке, но процесс контекста по-прежнему сохраняет запись об этом products, шаблон больше не может находить обратный URL. Как мне "сбросить" эту ситуацию (т.е. сбросить все мои продукты или процессоры контекста)?

1 Ответ

0 голосов
/ 09 июля 2020

я думаю, у вас есть приложение под названием 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>
...