我正在为我的公司创建一个库存管理系统。我不知道为什么会出现错误: 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。
答案 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 %}