django错误:django.urls.exceptions.NoReverseMatch

时间:2019-05-28 17:19:26

标签: python django django-templates django-views

我正在为我的公司创建一个库存管理系统。我不知道为什么会出现错误: NoReverseMatch 对于 item_edit item_delete 视图或URL一直出现。由于这些错误,我无法编译我的CRUD视图并不能修改或删除现有项目。

错误:“ django.urls.exceptions.NoReverseMatch:找不到'stock_management.views.item_edit'的反向。”

我已经尝试了很多时间来遍历我的代码。我还尝试过从外壳程序中为item_edit和item_delete调用reverse()函数,并且还尝试在浏览器中手动输入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 个答案:

答案 0 :(得分:2)

使用url时,您需要在html文件中添加带有已用url的appname。 同时更新

   <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 %}