Fra*_*lfi 1 django ajax bootstrap-modal
我正在尝试在 Django 应用程序的 Bootstrap 模式中显示产品的详细信息。
我将此主题作为参考:堆栈溢出问题。
但是我收到了 500 内部服务器错误。回应是:
NoReverseMatch at /catalog/product-detail/
'system' is not a registered namespace
Run Code Online (Sandbox Code Playgroud)
关于我做错了什么的任何线索或关于如何实现我的目标的任何建议?
谢谢!
HTML - AJAX 函数调用
<div class="row">
{% for y in productos %}
{% if y.categoria_producto|stringformat:"s" == objetivo %}
<button data-id="{{y.id}}" type="button" class="btn btn-warning margin-bottom delete-company" >delete</button>
{% endif %}
{% endfor %}
{% csrf_token %}
</div>
Run Code Online (Sandbox Code Playgroud)
AJAX 代码
$(document).on('click','.delete-company',function(){
var id = $(this).data('id');
$.ajax({
url:'/catalog/product-detail/',
type:'POST',
data:{
'id':id,
'csrfmiddlewaretoken': $('input[name=csrfmiddlewaretoken]').val(),
},
success:function(data){
$('#modalQuickView .modal-dialog').html($('#modalQuickView .modal-dialog',data));
$('#modalQuickView').modal('show');
},
error:function(){
console.log('error')
},
});
});
Run Code Online (Sandbox Code Playgroud)
HTML 模态
<div class="modal fade" id="modalQuickView" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg" role="document">
<div class="modal-content">
<div class="modal-body">
<div class="row">
<div class="col-lg-5">
<!--Carousel Wrapper-->
<div id="carousel-thumb" class="carousel slide carousel-fade carousel-thumbnails" data-ride="carousel">
<!--Slides-->
<div class="carousel-inner" role="listbox">
<div class="carousel-item active">
<img class="d-block w-100" src="{% static 'img/Cinta1.jpg' %}" alt="Kinemed - ">
</div>
<div class="carousel-item">
<img class="d-block w-100" src="{% static 'img/Cinta2.jpg' %}" alt="Kinemed - ">
</div>
</div>
<!--/.Slides-->
<!--Controls-->
<a class="carousel-control-prev" href="#carousel-thumb" role="button" data-slide="prev">
<span class="carousel-control-prev-icon" aria-hidden="true"></span>
<span class="sr-only">Previous</span>
</a>
<a class="carousel-control-next" href="#carousel-thumb" role="button" data-slide="next">
<span class="carousel-control-next-icon" aria-hidden="true"></span>
<span class="sr-only">Next</span>
</a>
<!--/.Controls-->
</div>
<!--/.Carousel Wrapper-->
</div>
<div class="col-lg-7" style="padding-left: 10px; margin-top: 1rem;">
{% if company %} <!-- this company instance will come from AJAX -->
<form method="post" action="{% url 'system:company_delete' id=company.id %}">
{% csrf_token %}
<div class="modal-content">
<div class="modal-body">
<input type="text" name="name" maxlength="100" required="" id="id_name" value="{{ company.id }}">
<input type="submit" class="btn btn-primary" value="Delete">
</div>
</div>
</form>
{% endif %}
</div>
<div style="padding-top: 1.5rem;">
<button type="button" class="btn btn-outline-info waves-effect ml-auto" data-dismiss="modal">Cerrar</button>
</div>
</div>
</div>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
看法
def companyListView(request):
context = {}
companys = ProductosBase.objects.all()
if request.method == 'POST' and request.is_ajax():
ID = request.POST.get('id')
company = companys.get(id=ID) # So we send the company instance
context['company'] = company
context['companys'] = companys
return render(request,'catalog/artista.html',context)
Run Code Online (Sandbox Code Playgroud)
网址
url(r'^product-detail/$', views.companyListView, name="companyListView"),
Run Code Online (Sandbox Code Playgroud)
我认为关于这个问题的最重要的信息是在你项目的 urls.py 文件中,你在其中包含了目录 url并在那里使用了一个命名空间。您在评论中提供了此信息。看起来您没有在 urlpatterns 列表上方的目录 urls.py 文件顶部定义应用程序,这导致了问题。因此,请检查以下内容。
在目录 urls.py 文件中:
app_name = 'system' # if your namespace is 'system.
urlpatterns = [
...]
Run Code Online (Sandbox Code Playgroud)
如果你给 namespace='catalog'
然后你应该在你的目录 urls.py 文件中定义它
app_name = 'catalog'
Run Code Online (Sandbox Code Playgroud)
在这种特殊情况下更简单的解决方案:
由于这个命名空间在你的项目中还没有相关性,那么你应该在包含之后从你的主 urls.py 文件中删除 namespace='system',所以它应该看起来像这样:
url(r'^catalog/', include('catalog.urls')),
Run Code Online (Sandbox Code Playgroud)
(注意:最好使用 path() 因为 url() 很可能会被弃用)所以:
from django.urls import path
path('/catalog/', include('catalog.urls')),
Run Code Online (Sandbox Code Playgroud)
这样你就可以忽略我上面的建议(所以你不必在任何地方定义任何应用程序),你的问题也应该得到解决。
稍后,当你继续你的项目时,你应该更多地研究如何以及何时为 url 使用命名空间,因为它很多时候是多余的。
如果仍然有网址问题:
您可以在主项目 urls.py 文件中定义视图的 url,只是为了查看是否收到 ajax 调用,因此:
url(r'^catalog/product-detail/', views.companyListView, name='companylist'),
Run Code Online (Sandbox Code Playgroud)
在最后一种情况下,不要忘记导入主 urls.py 文件中的视图,否则它也不起作用,所以:
from catalog import views # in main urls.py file, if catalog is your app name
Run Code Online (Sandbox Code Playgroud)
最后,主要问题是 AJAX 调用 url 中的打开反斜杠 /...(它导致没有反向匹配错误)。所以,简单的结论是:如果有人在 urlpatterns 中定义了一个带有打开反斜杠的 url,那么在 ajax 调用中它应该是相同的方式,否则不打开反斜杠/。嗯,是的……待续……
更新 - 解决如何在 Django 中使用 AJAX 将数据传递到 HTML 模态的原始问题
所以,让我们看看。很多事情在这里基本上被误解了,我试图用一种工作方法来清除它。通过使用 AJAx/jQuery/javascript,您实际上绕过了 Django 模板标签/变量的很大一部分。这就是使用 jQuery/javascript 的全部意义所在。
首先,我仍然建议您在 Django 中定义 urlpatterns 时使用path()和re-path()而不是 url() 。url() 将被弃用,正如我上面提到的。使用 path() 还有其他重要原因。
所以你的主 urls.py应该是这样的:
# main project urls.py
from django.contrib import admin
from django.urls import include, path
from django.conf.urls import url
urlpatterns = [
path('catalog/', include('catalog.urls')),
path('admin/', admin.site.urls),
]
Run Code Online (Sandbox Code Playgroud)
你的目录 urls.py应该是这样的:
# catalog urls.py
from django.conf.urls import url
from django.urls import include, path
from . import views
urlpatterns = [
url(r'^$', views.index, name='index'),
]
urlpatterns += [
url(r'^marcas/(?P<person_id>[\d\D]+)/$', views.MarcasView, name="marcas"),
url(r'^categorias_productos/(?P<person_id>[\d\D]+)/$', views.CategoriasView, name="categoria"),
url(r'^your-name/$', views.create_user, name="create_user"),
path('product-detail/', views.companyListView, name="companylist"),
]
Run Code Online (Sandbox Code Playgroud)
的的JavaScript / AJAX调用和响应处理必须重新构建,并改变了这里和那里。但同样,正确的 urls.py 对于 ajax 调用的工作也非常重要。还有视图函数(我会把它放在模板之后)。
这是在base_generic.html模板的底部
{% block scripts %}
<script>
$(function(){
$('.show_product').on('click', function (e) {
e.preventDefault();
let product_id = $(this).attr('id');
$.ajax({
url:'/catalog/product-detail/',
type:'POST',
data: $('#form_have_product_'+product_id).serialize(),
success:function(response){
console.log(response);
$('.show_product').trigger("reset");
openModal(response);
},
error:function(){
console.log('something went wrong here');
},
});
});
});
function openModal(product_data){
$('#product_name').text(product_data.company.producto);
$('#marcas_name').text(product_data.marca);
$('#category_name').text(product_data.categoria_producto_id);
$('#sizes').text(product_data.company.largo);
$('#color_name').text(product_data.company.color);
$('#packaging').text(product_data.company.packaging);
$('.description1 > p:eq(0)').html(product_data.company.descripcion);
$('#product_target').text(product_data.usos);
$('#modal_img_1').attr('src', '/static/img/'+product_data.company.foto_1 );
$('#modal_img_2').attr('src', '/static/img/'+product_data.company.foto_2 );
$('#modalQuickView').modal('show');
};
</script>
{% endblock %}
Run Code Online (Sandbox Code Playgroud)
名为artista.html的模板必须重新编写。
{% extends "base_generic.html" %}
{% load static %}
{% block content %}
<!-- Productos por categoría -->
<!-- Modal: modalQuickView -->
<div class="modal fade" id="modalQuickView" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel"
aria-hidden="true">
<div class="modal-dialog modal-lg" role="document">
<div class="modal-content">
<div class="modal-body">
<div class="row">
<div class="col-lg-5">
<!--Carousel Wrapper-->
<div id="carousel-thumb" class="carousel slide carousel-fade carousel-thumbnails" data-ride="carousel">
<!--Slides-->
<div class="carousel-inner" role="listbox">
<div class="carousel-item active">
<img id="modal_img_1" class="d-block w-100" src="{% static 'img/Cinta1.jpg' %}" alt="Kinemed - ">
</div>
<div class="carousel-item">
<img id="modal_img_2" class="d-block w-100" src="{% static 'img/Cinta2.jpg' %}" alt="Kinemed - ">
</div>
</div>
<!--/.Slides-->
<!--Controls-->
<a class="carousel-control-prev" href="#carousel-thumb" role="button" data-slide="prev">
<span class="carousel-control-prev-icon" aria-hidden="true"></span>
<span class="sr-only">Previous</span>
</a>
<a class="carousel-control-next" href="#carousel-thumb" role="button" data-slide="next">
<span class="carousel-control-next-icon" aria-hidden="true"></span>
<span class="sr-only">Next</span>
</a>
<!--/.Controls-->
</div>
<!--/.Carousel Wrapper-->
</div>
<!--This popup modal will be opened by the ajax call - Important-->
<div class="col-lg-7" style="padding-left: 10px; margin-top: 1rem;">
<h1 id="product_name">Product name</h1>
<h3 id="marcas_name"><a href="" class="artist-style" style="color: #21518A; font-size: 1rem; margin-top: 1rem; padding-left: 0px;">SpiderTech</a></h3>
<h4 id="category_name"><p class="artist-info" style="font-size: 1rem; color: black; padding-left: 0; margin-top: 0.5rem; margin-bottom: 5px;">Cintas kinesiológicas</p></h4>
<h4 id="sizes"><p class="artist-info" style="font-size: 1rem; color: black; padding-left: 0; margin-top: 1rem; margin-bottom: 5px;">3,8 cms X 5,0 mts</p></h4>
<h4 id="color_name"><p class="artist-info" style="font-size: 1rem; color: black; padding-left: 0; margin-top: 1rem; margin-bottom: 5px;">Beige</p></h4>
<h4 id="packaging"><p class="artist-info" style="font-size: 1rem; color: black; padding-left: 0; margin-top: 1rem; margin-bottom: 5px;">Retail PET box</p></h4>
<h4 id=""><p class="artist-info" style="font-size: 1rem; color: black; padding-left: 0; margin-top: 1rem; margin-bottom: 5px;"></p></h4>
<div id="description1" class="description1" style="color: #21518A;">
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris.</p>
<h6 id="product_target_label" style="color: black;">Usos: </h6>
<p id="product_target">Protección muscular, Recuperación</p>
</div>
</div>
<div style="padding-top: 1.5rem;">
<button type="button" class="btn btn-outline-info waves-effect ml-auto" data-dismiss="modal">Cerrar</button>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Fin Modal product detail -->
<!-- Productos por categoría -->
{% for x in categorias %}
{% if x.categoria_producto|stringformat:"s" == objetivo %}
<div class="jumbotron" style="background-color: #1986E6">
<div class="container">
<div class="row">
<div class="barra" style="background-color: white;"></div>
<div class="col-12 text-center">
<h1 style="color: #FCFCFC">{{ objetivo }}</h1>
</div>
<div class="col-sm-12 col-md12 col-lg-12 col-xl-6 text-center" style="padding-top: 1rem;">
<h6 style="color: #FCFCFC">{{ x.descripcion_brief }}</h6>
</div>
</div>
<div style="padding-top: 1rem;">
<button type="button" class="btn btn-secondary btn-sm" data-toggle="collapse"
data-target="#demo"><i class="fas fa-info-circle"></i> Más información</button>
</div>
</div>
<div class="container collapse" id="demo">
<div class="row" style="padding-top: 40px; padding-bottom: 20px;">
<div class="col-lg-6 col-lg-6-custom col-sm-12">
<div class="videoWrapper">
<!-- Copy & Pasted from YouTube -->
<iframe src="{{ x.video }}" width="640" height="360" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>
</div>
<div class="row">
<div class="col-lg-6 col-md6 col-sm-6 col-xl-6 text-center">
<img style="width: 100%; position: relative;" border="0"alt="{{ objetivo }}" src=" {{ x.foto_1.url }} " class="esconder">
</div>
<div class="col-lg-6 col-md63 col-sm-6 col-xl-6 text-center">
<img style="width: 100%; position: relative;" border="0" alt="{{ objetivo }}" src=" {{ x.foto_2.url }} " class="esconder">
</div>
</div>
</div>
<div class="col-lg-6 col-lg-6-custom col-sm-12">
<div class="texto-brief">
<p>{{ x.descripcion_long }} </p>
<h6 style="color: white;">Usos</h6></br>
<p>{{ x.usos }} </p>
</div>
</div>
</div>
<div style="padding-top: 1rem;">
<button type="button" class="btn btn-secondary btn-sm" data-toggle="collapse"
data-target="#demo"><i class="fas fa-info-circle"></i> Menos información</button>
</div>
</div>
</div>
{% endif %}
{% endfor %}
<div class="jumbotron" style="background-color: white;">
<div class="container">
<div class="row">
{% for y in productos %}
{% if y.categoria_producto|stringformat:"s" == objetivo %}
<div class="col-sm-6 col-md-4 col-lg-2 col-xl-2 text-center" style="padding-bottom: 20px;">
<form name="form" action="#" id="form_have_product_{{y.id}}" method="POST">
{% csrf_token %}
<input name="id" id="product_id_submit" type="text" value="{{y.id}}" hidden="true"/>
<button id="{{y.id}}" "type="button" class="btn btn-warning margin-bottom show_product">Product details</button>
</form>
<!--<a id="" href="" data-toggle="modal" data-target="#modalQuickView"><img border="0" alt="W3Schools" src="{{ y.foto_1.url }}" class="artist-foto"></a> we don't need this-->
<div>
<a href="" id="{{y.id}}" data-id="{{y.id}}" class="artist-title show_product" style="color: black; padding-left: 0;" data-toggle="modal" >{{ y.producto }}</a> <!--data-target="#modalQuickView"-->
</div>
<div><a href="{% url 'marcas' person_id=y.marca %}" class="artist-style" style="color: #21518A; padding-left: 0;">{{ y.marca }}</a></div>
<div><p class="artist-info" style="color: #21518A; padding-left: 0; margin-bottom: 5px; margin-top: 5px;">{{ y.packaging }}</p></div>
<div><p class="artist-info" style="color: #21518A; padding-left: 0; margin-bottom: 5px;">{{ y.color }}</p></div>
<div><p class="artist-info" style="color: #21518A; padding-left: 0; margin-bottom: 5px;">{{ y.ancho }} cms. X {{ y.largo }} mts.</p></div>
</div>
{% endif %}
{% endfor %}
</div>
</div>
</div>
<div class="jumbotron" style="background-color: lightgrey;">
<div class="container">
<div class="row">
<div class="barra" style="background-color: #21518A;"></div>
<div class="col-12 text-center">
<h1 style="color: #21518A">Más productos</h1>
</div>
</div>
<div class="row" style="margin-top: 1rem;">
<div class="col-sm-12 col-md-12 col-lg-12 col-xl-12 text-center" style="padding-bottom: 20px;">
{% for z in categorias %}
{% if z.categoria_producto|stringformat:"s" != objetivo %}
<h3><a style="color: #21518A;" href=" {% url 'categoria' person_id=z.categoria_producto %} "> {{ z.categoria_producto }}</a></h3>
{% endif %}
{% endfor %}
</div>
</div>
</div>
</div>
{% endblock %}
Run Code Online (Sandbox Code Playgroud)
最后,最重要的事情之一,views.py文件,我们在其中处理 ajax 调用并返回所有产品数据,这些数据将在每个产品的弹出模式中填充,使用 javascript/ jQuery(我在上面给出的)。
from django.shortcuts import render
from django.http import HttpResponseRedirect, HttpResponse, HttpRequest
from django.urls import reverse
from .models import ProductosBase, Marcas, Categorias_Producto
from .forms import FormularioContacto
from django.http import JsonResponse
import copy
import json
from django.forms.models import model_to_dict
from django.core import serializers
## other views functions are here.... ##
def companyListView(request):
context = {}
companys = ProductosBase.objects.values()
context[companys] = ProductosBase.objects.all()
if request.method == 'POST' and request.is_ajax():
ID = request.POST.get('id')
company = companys.get(pk=ID) # So we send the company instance
marca_name = ProductosBase.objects.get(pk=ID).marca # to have the related fields - marca
marca_name = model_to_dict(marca_name) # better in dict
marca_name = marca_name['marca'] # to define marca for the product
usos_product = ProductosBase.objects.get(pk=ID).categoria_producto # we need usos field from categories
usos_product = model_to_dict(usos_product)
usos_product = usos_product['usos']
return JsonResponse({ 'company' : company, 'marca' : marca_name, 'usos' : usos_product })
else:
return render(request, 'catalog/artista.html', context)
Run Code Online (Sandbox Code Playgroud)
最后是显示模态如何与任何产品一起工作的视觉效果,为点击的产品提供所有需要的数据:
所以,你的应用程序做得很好,基础知识和模板工作都很好,但你应该更多地研究 jQuery/javascript 在 Django 项目中的作用和力量。他们在一起真的很强大。
我希望你会使用和学习上面的代码,你也可以在以后的项目中使用它。干杯。:)
| 归档时间: |
|
| 查看次数: |
8444 次 |
| 最近记录: |