ошибка django: django.urls.exceptions.NoReverseMatch - PullRequest
1 голос
/ 28 мая 2019

Я создаю систему управления запасами для своей компании. Я не знаю, почему ошибка: NoReverseMatch продолжает появляться для item_edit и item_delete просмотров или URL. Из-за этих ошибок я не могу завершить свои представления CRUD и изменить или удалить существующий элемент.

Ошибка: «django.urls.exceptions.NoReverseMatch: обратное для« stock_management.views.item_edit »не найдено».

Я уже много раз пытался просмотреть свой код. Я также попытался вызвать функцию reverse () для item_edit и item_delete из оболочки, а также попытался вручную ввести URL-адреса в браузере, но все равно отображается та же ошибка.

Мои модели:


class Item(models.Model):
    GOLD_PURITY_CHOICES = (
        ...
    )
    COLOUR_CHOICES = (
        ...
    )
    DIAMOND_PURITY_CHOICES = (
        ...
    )
    RATING_CHOICES = (
        ...
    )

    code = models.CharField(max_length=25, db_index=True, unique=True)
    gold_purity = models.CharField(
        max_length=3, choices=GOLD_PURITY_CHOICES, default='14K')
    labour = models.PositiveIntegerField()
    certification_no = models.CharField(max_length=35, null=True, blank=True)
    diamond_colour = models.CharField(
        max_length=4, choices=COLOUR_CHOICES, default='F')
    diamond_purity = models.CharField(
        max_length=10, choices=DIAMOND_PURITY_CHOICES, default='IF')
    rating = models.CharField(
        max_length=3, default='A', choices=RATING_CHOICES)
    gross = models.DecimalField(max_digits=6, decimal_places=3)
    image = models.ImageField(blank=True, null=True,
                              upload_to=user_directory_path)

    def __str__(self):
       ...

class Color(models.Model):
    item = models.ForeignKey(
        Item, on_delete=models.CASCADE, related_name='colors', help_text='Item to which the colors belong.')
    shade = models.DecimalField(...)
    price = models.IntegerField(...)


class Diamond(models.Model):
    item = models.ForeignKey(
        Item, on_delete=models.CASCADE, related_name='diamonds', help_text='Item to which the diamond belong.')
    weight = models.DecimalField(...)
    rate = models.IntegerField(...)

urls.py:

from django.urls import path, include
from .views import *
from django.conf import settings

app_name = 'stock_management'

urlpatterns = [
    path('', index, name='homepage'),
    path('stock/', stock_list, name='stock_list'),
    path('stock/add', stock_create_view, name='add_stock'),

    # Item:
    path('item/edit/<pk>', item_edit, name='item_edit'),
    path('item/delete/<pk>', ItemDeleteView.as_view(), name='item_delete'),
]

if settings.DEBUG:
    # test mode
    from django.conf.urls.static import static
    urlpatterns += static(settings.STATIC_URL,
                          document_root=settings.STATIC_ROOT)
    urlpatterns += static(settings.MEDIA_URL,
                          document_root=settings.MEDIA_ROOT)

views.py:

def item_edit(request, pk=1):
    item = get_object_or_404(Item, pk=pk)
    ColorInlineFormSet = inlineformset_factory(
        Item, Color, fields=('shade', 'price'), extra=1)
    DiamondInlineFormSet = inlineformset_factory(
        Item, Diamond, fields=('weight', 'rate'), extra=1)

    if request.method == 'POST':
        color_inline_formset = ColorInlineFormSet(
            request.POST, instance=item)
        diamond_inline_formset = DiamondInlineFormSet(
            request.POST, instance=item)
        item_form = ItemForm(request.POST, instance=item)

       if item_form.is_valid() and color_inline_formset.is_valid() and diamond_inline_formset.is_valid():
            item = item_form.save()
            color_formset = color_inline_formset.save()
            diamond_formset = diamond_inline_formset.save()
            return redirect('stock_management:homepage')
        else:
            messages.error(request, item_form.errors)
            messages.error(request, color_inline_formset.errors)
            messages.error(request, diamond_inline_formset.errors)

    else:
        color_inline_formset = ColorInlineFormSet(
            instance=item)
        diamond_inline_formset = DiamondInlineFormSet(
            instance=item)
        item_form = ItemForm(instance=item)

    return render(request, 'forms/add_stock.html', {'title': 'Edit Item Form', 'item': item, 'item_form': item_form, 'item_colour_forms': color_inline_formset, 'item_diamond_forms': diamond_inline_formset, })


def item_delete(request, pk):
    item = get_object_or_404(Item, pk=pk)
    if request.method == 'POST':
        item.delete()
        return redirect('stock_list')
    return render(request, 'forms/utils/confirm_delete.html', {'title': item})

шаблоны: list.html:

{% extends 'index.html' %} 
{% block title %} Stock {% endblock %} 
{% block pageheading %} Stock List {% endblock %} 
{% block content %} 
{% for stock in stocks %}
<div class="card-body">

  <div class="item pb-1">
    <h5>{{ stock.item.code }}</h5>
    {% if stock.item.image %}
      <image src = " {{ stock.item.image.url }} " ></image>
    {% endif %}
  <a href=" {% url 'item_delete' stock.item.id %} " class="btn btn-danger btn-circle">
    <i class="fas fa-trash"></i>
  </a>
  <a href="{% url 'item_edit' pk=stock.item.id %}" class="btn btn-info btn-circle">
    <i class="far fa-edit"></i>
  </a>
</div>
{% endfor %}
{% endblock %}

Я хочу, чтобы ошибка была устранена, чтобы я мог завершить свои представления CRUD, а также снова получить доступ к своему list.html.

1 Ответ

2 голосов
/ 28 мая 2019

Вам необходимо добавить имя вашего приложения с использованными URL-адресами в ваши HTML-файлы при использовании URL-адресов. Также обновите

   <a href=" {% url 'stock_management:item_delete' pk=stock.item.id %}

до

 <a href=" {% url 'stock_management:item_delete' stock.item.id %}

Ваш код должен выглядеть так:

{% extends 'index.html' %} 
{% block title %} Stock {% endblock %} 
{% block pageheading %} Stock List {% endblock %} 
{% block content %} 
{% for stock in stocks %}
<div class="card-body">

  <div class="item pb-1">
    <h5>{{ stock.item.code }}</h5>
    {% if stock.item.image %}
      <image src = " {{ stock.item.image.url }} " ></image>
    {% endif %}
  <a href=" {% url 'stock_management:item_delete' stock.item.id %} " class="btn btn-danger btn-circle">
    <i class="fas fa-trash"></i>
  </a>
  <a href="{% url 'stock_management:item_edit' stock.item.id %}" class="btn btn-info btn-circle">
    <i class="far fa-edit"></i>
  </a>
</div>
{% endfor %}
{% endblock %}
...