【发布时间】:2021-08-14 08:27:24
【问题描述】:
错误
NoReverseMatch 在 /cart/
未找到“ProductView”的反向。 'ProductView' 不是有效的视图函数或模式名称。
请求方法:GET
请求网址:http://127.0.0.1:8000/cart/
Django 版本:3.2.3
异常类型:NoReverseMatch
异常值:
未找到“ProductView”的反向。 'ProductView' 不是有效的视图函数或模式名称。
错误截图
ProductApp 模板'app/base.html'
<!doctype html>
{% load static %}
<html lang="en">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<base href="/">
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Poppins:200,300,400,500,600,700,800&display=swap" type="text/css">
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Lora:400,400i,700,700i&display=swap" type="text/css">
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Amatic+SC:400,700&display=swap" type="text/css">
<!-- Bootstrap CSS -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous">
<!-- <link rel="stylesheet" href="{% static 'app/css/open-iconic-bootstrap.min.css' %}">
<link rel="stylesheet" href="{% static 'app/css/animate.css' %}"> -->
<!--Owl Carousel CSS-->
<link rel="stylesheet" href="{% static 'app/css/owl.theme.default.min.css' %}" type="text/css">
<link rel="stylesheet" href="{% static 'app/css/magnific-popup.css' %}" type="text/css">
<link rel="stylesheet" href="{% static 'app/css/aos.css' %}" type="text/css">
<link rel="stylesheet" href="{% static 'app/css/ionicons.min.css' %}" type="text/css">
<link rel="stylesheet" href="{% static 'app/css/bootstrap-datepicker.css' %}" type="text/css">
<link rel="stylesheet" href="{% static 'app/css/jquery.timepicker.css' %}" type="text/css">
<link rel="stylesheet" href="{% static 'app/css/flaticon.css' %}" type="text/css">
<link rel="stylesheet" href="{% static 'app/css/icomoon.css' %}" type="text/css">
<link rel="stylesheet" href="{% static 'app/css/owl.carousel.min.css' %}" type="text/css">
<!--FontAwesome CSS-->
<link rel="stylesheet" href="{% static 'app/css/all.min.css' %}" type="text/css">
<!--Custom CSS-->
<link rel="stylesheet" href="{% static 'app/css/style.css' %}" type="text/css">
<!-- <link rel="stylesheet" href="{% static 'app/css/style.css' %}"> -->
<title>VEGEFOODS | {% block title %} {% endblock title %} </title>
</head>
<body>
<nav class="navbar navbar-expand-lg navbar-dark ftco_navbar bg-dark ftco-navbar-light" id="ftco-navbar">
<div class="container">
<a class="navbar-brand" href="{% url 'app:home' %}">VEGEFOODS</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
</ul>
<div>
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
<li class="nav-item">
<a class="nav-link active" aria-current="page" href="{% url 'app:home' %}">Home</a>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="electronicsDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">
Shop
</a>
<ul class="dropdown-menu" aria-labelledby="electronicsDropdown">
<li><a class="dropdown-item" href="{% url 'app:Vegetables' %}">Vegatables</a></li>
<li><a class="dropdown-item" href="{% url 'app:Fruits' %}">Fruits</a></li>
<li><a class="dropdown-item" href="{% url 'app:Dried' %}">Dried</a></li>
</ul>
</li>
<li class="nav-item mx-2">
<a href="{% url 'app:showcart' %}" class="nav-link"><span class="badge bg-danger">4</span> Cart </a>
</li>
{% if request.user.is_authenticated %}
<li class="nav-item dropdown mx-2">
<a class="nav-link dropdown-toggle" href="#" id="profileDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">
{{request.user.username.title}}
</a>
<ul class="dropdown-menu" aria-labelledby="profileDropdown">
<li><a class="dropdown-item" href="{% url 'app:profile' %}">Profile</a></li>
<li><a class="dropdown-item" href="{% url 'app:orders' %}">Orders</a></li>
<li><a class="dropdown-item" href="{% url 'app:passwordchange' %}">Change Password</a></li>
<li><a class="dropdown-item" href="{% url 'app:logout' %}">Logout</a></li>
</ul>
</li>
{% else %}
<li class="nav-item mx-2">
<a href="{% url 'app:login' %}" class="nav-link">Login</a>
</li>
{% endif %}
</ul>
</div>
</div>
</div>
</nav>
{% block banner_slider %} {% endblock banner_slider %}
{% block main-content %} {% endblock main-content %}
<!-- Start Footer -->
<footer class="ftco-footer ftco-section">
<div class="container">
<div class="row">
<div class="mouse align-items-center">
<a href="#" class="mouse-icon align-items-center">
<div class="mouse-wheel align-items-center"><span class="ion-ios-arrow-up align-items-center"></span></div>
</a>
</div>
</div>
<div class="row mb-5">
<div class="col-md">
<div class="ftco-footer-widget mb-4">
<h2 class="ftco-heading-2">Vegefoods</h2>
<p>Far far away, behind the word mountains, far from the countries Vokalia and Consonantia.</p>
<ul class="ftco-footer-social list-unstyled float-md-left float-lft mt-5">
<li class="ftco-animate"><a href="#"><span class="icon-twitter"></span></a></li>
<li class="ftco-animate"><a href="#"><span class="icon-facebook"></span></a></li>
<li class="ftco-animate"><a href="#"><span class="icon-instagram"></span></a></li>
</ul>
</div>
</div>
<div class="col-md">
<div class="ftco-footer-widget mb-4 ml-md-5">
<h2 class="ftco-heading-2">Menu</h2>
<ul class="list-unstyled">
<li><a href="#" class="py-2 d-block">Shop</a></li>
<li><a href="#" class="py-2 d-block">About</a></li>
<li><a href="#" class="py-2 d-block">Journal</a></li>
<li><a href="#" class="py-2 d-block">Contact Us</a></li>
</ul>
</div>
</div>
<div class="col-md-4">
<div class="ftco-footer-widget mb-4">
<h2 class="ftco-heading-2">Help</h2>
<div class="d-flex">
<ul class="list-unstyled mr-l-5 pr-l-3 mr-4">
<li><a href="#" class="py-2 d-block">Shipping Information</a></li>
<li><a href="#" class="py-2 d-block">Returns & Exchange</a></li>
<li><a href="#" class="py-2 d-block">Terms & Conditions</a></li>
<li><a href="#" class="py-2 d-block">Privacy Policy</a></li>
</ul>
<ul class="list-unstyled">
<li><a href="#" class="py-2 d-block">FAQs</a></li>
<li><a href="#" class="py-2 d-block">Contact</a></li>
</ul>
</div>
</div>
</div>
<div class="col-md">
<div class="ftco-footer-widget mb-4">
<h2 class="ftco-heading-2">Have a Questions?</h2>
<div class="block-23 mb-3">
<ul>
<li><span class="icon icon-map-marker"></span><span class="text">203 Fake St. Mountain View, San Francisco, California, USA</span></li>
<li><a href="#"><span class="icon icon-phone"></span><span class="text">+2 392 3929 210</span></a></li>
<li><a href="#"><span class="icon icon-envelope"></span><span class="text">info@yourdomain.com</span></a></li>
</ul>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12 text-center">
<p>
Copyright @ 2021
</p>
</div>
</div>
</div>
</footer> <!-- End Footer -->
<!-- loader -->
<!-- <div id="ftco-loader" class="show fullscreen"><svg class="circular" width="48px" height="48px"><circle class="path-bg" cx="24" cy="24" r="22" fill="none" stroke-width="4" stroke="#eeeeee"/><circle class="path" cx="24" cy="24" r="22" fill="none" stroke-width="4" stroke-miterlimit="10" stroke="#F96D00"/></svg></div> -->
<!-- Jquery -->
<script src="https://code.jquery.com/jquery-3.5.1.min.js" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script>
<!-- Bootstrap Bundle with Popper -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/js/bootstrap.bundle.min.js" integrity="sha384-ygbV9kiqUc6oa4msXn9868pTtWMgiQaeYH7/t7LECLbyPA2x65Kgf80OJFdroafW" crossorigin="anonymous"></script>
<script src="{% static 'app/js/owl.carousel.min.js' %}"></script>
<script src="{% static 'app/js/all.min.js' %}"></script>
<script src="{% static 'app/js/myscript.js' %}"></script>
<script src="{% static 'app/js/main.js' %}"></script>
<script src="{% static 'app/js/jquery.min.js' %}"></script>
<script src="{% static 'app/js/jquery-migrate-3.0.1.min.js' %}"></script>
<script src="{% static 'app/js/popper.min.js' %}"></script>
<script src="{% static 'app/js/bootstrap.min.js' %}"></script>
<script src="{% static 'app/js/jquery.easing.1.3.js' %}"></script>
<script src="{% static 'app/js/jquery.waypoints.min.js' %}"></script>
<script src="{% static 'app/js/jquery.stellar.min.js' %}"></script>
<script src="{% static 'app/js/owl.carousel.min.js' %}"></script>
<script src="{% static 'app/js/jquery.magnific-popup.min.js' %}"></script>
<script src="{% static 'app/js/jquery.animateNumber.min.js' %}"></script>
<script src="{% static 'app/js/bootstrap-datepicker.js' %}"></script>
<script src="{% static 'app/js/scrollax.min.js' %}"></script>
<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyBVWaKrjvy3MaE7SQ74_uJiULgl1JY0H2s&sensor=false"></script>
<script src="{% static 'app/js/google-map.js' %}"></script>
<!-- <script src="https://unpkg.com/aos@next/dist/aos.js"></script> -->
<script src="{% static 'app/js/aos.js' %}"></script>
</body>
</html>
ProductApp view.py
def ProductView(request):
vegetables = Products.objects.filter(Sub_Category_ID__CategoryID__name='Vegetables')
return render(request, 'app/home.html',{'Vegetables':vegetables})
ProductApp urls.py
from re import template
from django.urls import path
from app import views
from django.conf import settings
from django.conf.urls.static import static
from django.contrib.auth import views as auth_views
from.forms import LoginForm, MyPasswordChangeForm
app_name='app'
urlpatterns = [
# path('', views.home),
path('',views.ProductView,name='home'),
path('product-detail/<int:pk>', views.ProductDetailView.as_view(), name='product-detail'),
# path('add-to-cart/', views.add_to_cart, name='add-to-cart'),
path('showcart/',views.show_cart,name='showcart'),
# path('pluscart/',views.plus_cart),
# path('minuscart/',views.minus_cart),
# path('removecart/',views.remove_cart),
# path('add-to-cart/<slug:data>', views.add_to_cart, name='add-to-cart_DATA'),
path('buy/', views.buy_now, name='buy-now'),
path('profile/', views.ProfileView.as_view(), name='profile'),
path('address/', views.address, name='address'),
path('orders/', views.orders, name='orders'),
# path('changepassword/', views.change_password, name='changepassword'),
path('Fruits/', views.Fruits, name='Fruits'),
path('Fruits/<slug:data>', views.Fruits, name='FruitsData'),
path('Dried/', views.Dried, name='Dried'),
path('Dried/<slug:data>', views.Dried, name='DriedData'),
path('Vegetables/', views.Vegetables, name='Vegetables'),
path('Vegetables/<slug:data>', views.Vegetables, name='VegetablesData'),
path('accounts/login/',auth_views.LoginView.as_view(template_name='app/login.html',authentication_form=LoginForm),name='login'),
path('passwordchange/',auth_views.PasswordChangeView.as_view(template_name='app/passwordchange.html',form_class=MyPasswordChangeForm, success_url='/passwordchangedone/'),name='passwordchange'),
path('passwordchangedone/',auth_views.PasswordChangeDoneView.as_view(template_name='app/passwordchangedone.html'),name='passwordchangedone'),
path('logout/',auth_views.LogoutView.as_view(next_page='login'),name='logout'),
# path('login/', views.login, name='login'),
path('registration/', views.CustomerRegistrationView.as_view(), name='customerregistration'),
path('checkout/', views.checkout, name='checkout'),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
CartApp Views.py
from cart.forms import CartAddProductForm
from django.shortcuts import get_object_or_404, redirect, render
from app.models import Products
from django.views.decorators.http import require_POST
from .cart import Cart
from .forms import CartAddProductForm
# Create your views here.
@require_POST
def cart_add(request, product_id):
cart = Cart(request)
product = get_object_or_404(Products, id=product_id)
form = CartAddProductForm(request.POST)
if form.is_valid():
cd = form.cleaned_data
cart.add(product=product, quantity=cd['quantity'])
return redirect('cart:cart_detail')
def cart_remove(request,product_id):
cart = Cart(request)
product = get_object_or_404(Products, id=product_id)
cart.remove(product)
return redirect('cart:car_detail')
def cart_detail(request):
cart = Cart(request)
return render (request ,'cart/cartdetail.html',{'cart':cart})
CartApp 网址
from django import urls
from django.urls import path
from django.urls.conf import include
from . import views
app_name='cart'
extra_patterns = [
path('add/carts/<int:product_id>/', views.cart_add, name='cart_add'),
]
urlpatterns=[
path ('add/',include(extra_patterns)),
path ('remove/<int:product_id>/',views.cart_remove,name='cart_remove'),
path ('',views.cart_detail,name='cart_detail'),
]
** CartApp 模板'detail.html'**
{% extends 'app/base.html' %}
{% load static %}
{% block title %}Cart{% endblock title %}
{% block main-content %}
<div class="container my-5">
<div class="row">
<h1 class="text-center mb-5">Shopping Cart</h1>
<div class="col-sm-8">
<div class="card">
<div class="card-body">
<h3>Cart</h3>
{% for items in cart %}
{% with product=items.product %}
<div class="row">
<div class="col-sm-3 text-center align-self-center">
<img src={{product.product_image.url}} alt="" srcset="" class="img-fluid img-thumbnail shadow-sm" height="150" width="150">
</div>
<div class="col-sm-9">
<div>
<h5>{{product.name}}</h5>
<p class="mb-2 text-muted small">Description: {{product.description}}</p>
<div class="my-3">
<label for="quantity">cart:</label>
<!-- <a class="minus-cart btn" pid="{{cart.productID.id}}"><i class="fas fa-minus-square fa-lg"></i></a> -->
<a class="minus-cart btn"><i class="fas fa-minus-square fa-lg"></i></a>
<span id="quantity">{{item.quantity}}</span>
<a class="plus-cart btn"><i class="fas fa-plus-square fa-lg"></i></a>
<!-- <a class="plus-cart btn" pid="{{cart.productID.id}}"><i class="fas fa-plus-square fa-lg"></i></a> -->
</div>
<div class="d-flex justify-content-between">
<form action="{% url 'cart:cart_remove' product.id %}" method="post">
<input type="submit" value="Remove">
{% csrf_token %}
</form>
<!-- <a class="btn btn-sm btn-secondary mr-3 remove-cart" pid="{{cart.productID.id}}"><strong>Remove Item</strong> </a> -->
<p class="mb-0"><span><strong>Rs. {{item.total_price}} </strong></span></p>
</div>
</div>
</div>
</div>
{% endwith %}
{% endfor %}
</div>
</div>
</div>
<div class="col-sm-4">
<div class="card">
<div class="card-body">
<h3>Total Amount</h3>
<ul class="list-group">
<!-- <li class="list-group-item d-flex justify-content-between align-items-center border-0 px-0 pb-0">Amount<span>Rs. <span id="amount">{{amount}}</span></span></li>
<li class="list-group-item d-flex justify-content-between align-items-center px-0">Shipping<span>Rs. 70.00</span></li> -->
<li class="list-group-item d-flex justify-content-between align-items-center border-0 px-0 mb-3">
<div>
<strong>Total</strong>
</div>
<span><strong>Rs. {{carts.get_total_price}}</strong></span>
</li>
</ul>
<!-- <div class="d-grid"><a href="{% url 'ProductView' %}" class="btn btn-primary">Continue Shopping</a></div> -->
<!-- <div class="d-grid"><a href="{% url 'app:checkout' %}" class="btn btn-primary">Place Order</a></div> -->
</div>
</div>
</div>
</div>
</div>
{% endblock main-content %}
MainProject Urls.py
from django.conf import settings
from django.conf.urls.static import static
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path ('cart/', include('cart.urls',namespace='cart')),
path('',include('app.urls',namespace='app')),
]
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
【问题讨论】:
-
删除那些 cmets
<!-- <div class="d-grid"><a href="{% url 'ProductView' %}" .... -->,一个 HTML 注释并不意味着 Django 不会尝试渲染它。
标签: javascript python html css django