【问题标题】:How to change the contents of a block dynamically on django?如何在 django 上动态更改块的内容?
【发布时间】:2015-11-22 14:30:01
【问题描述】:

查看下面的固定代码

我正在使用 django 1.8 开发我的第一个网页项目。我的网页有一个部分,该部分由一个产品菜单和一个基于所选菜单项显示不同视图的列组成。

起初我尝试了一种方法,其中每个菜单按钮都分配了一个 onclick js 函数来更改块的内容。我在想,然后我会将每个产品的 html 代码写入单独的文件中,并由 js 函数读取。我让它部分工作,但感觉有点粗略。

我的第二种方法是基于使用 django 模板,但作为初学者我遇到了一些错误,我无法弄清楚到底是什么问题。如果有人能指出我做错了什么或告诉我动态更改内容的正确方法是什么,我将不胜感激。

我目前遇到的错误:

http://127.0.0.1:8000/productmonitor/
NoReverseMatch at /productmonitor/
Reverse for 'product' with arguments '('',)' and keyword arguments '{}' not found. 1 pattern(s) tried: [u'productmonitor/(?P<product_name>[a-z]+)/$']

http://127.0.0.1:8000/productmonitor/
NoReverseMatch at /productmonitor/dualpol/
Reverse for 'product' with arguments '('',)' and keyword arguments '{}' not found. 1 pattern(s) tried: [u'productmonitor/(?P<product_name>[a-z]+)/$']

urls.py

# -*- coding: utf-8 -*-
from django.conf.urls import url

from . import views

urlpatterns = [
    url(r'^$', views.index, name='index'),
    url(r'^(?P<product_name>[A-Za-z0-9\-\_]+)/$', views.product, name='product'),
    url(r'^information/$', views.information, name='information'),
    url(r'^casedatabase/$', views.casedatabase, name='casedatabase'),
    url(r'^contact/$', views.contact, name='contact'),
]

views.py

from django.http import HttpResponse
from django.shortcuts import get_object_or_404, render
from django.views import generic
# Create your views here.
from .models import Product

def index(request, product_name='default'):
    #template = 'productmonitor/index.html'
    if product_name == 'dualpol':
        template = 'productmonitor/base_productmonitor_dualpol.html'
    if product_name == 'rhi':
        template = 'productmonitor/base_productmonitor_rhi.html'

    template = 'productmonitor/base_productmonitor.html'
    test_context = {
                    'products' : Product.objects.all(),                   
                    }
    return render(request, template, test_context)

def product(request, product_name='dualpol'):
    if product_name == 'dualpol':
        template = 'productmonitor/base_productmonitor_dualpol.html'
    if product_name == 'rhi':
        template = 'productmonitor/base_productmonitor_rhi.html'

    test_context = {
                    'products' : Product.objects.all(),                   
                    }
    return render(request, template, test_context)

base_productmonitor.html

{% extends "productmonitor/base.html" %}    
{% block content %}
    <div class="productSelectMenu">
        <ul>
            <p>Test</p>
            {% for product in products %}
                <li><a href="{% url 'productmonitor:product' 'dualpol' %}">{{ product.name }}<a/></li>  
            {% endfor %}
        </ul>
    </div>

    {% block productcontent %}
        <div id="productView" class="productView">
            <p>Default productView content</p>    
        </div>
    {% endblock %}
{% endblock %}

base_productmonitor_dualpol.html

{% extends "productmonitor/base_productmonitor.html" %}
{% block productcontent %}
<p>
    dualpol
</p>
{% endblock %}

编辑:固定版本

urls.py

# -*- coding: utf-8 -*-
from django.conf.urls import url

from . import views

urlpatterns = [
    url(r'^$', views.index, name='index'),
    url(r'^product/(?P<product_name>[a-z]+)/$', views.product, name='product'),
    url(r'^information/$', views.information, name='information'),
    url(r'^casedatabase/$', views.casedatabase, name='casedatabase'),
    url(r'^contact/$', views.contact, name='contact'),
]

views.py

enter code here
from django.http import HttpResponse
from django.shortcuts import get_object_or_404, render, redirect
from django.views import generic
# Create your views here.
from .models import Product

def index(request, product_name=''):
    return redirect('productmonitor:product', product_name='dualpol')

def product(request, product_name):
    if product_name == 'dualpol':
        template = 'productmonitor/base_productmonitor_dualpol.html'
    if product_name == 'rhi':
        template = 'productmonitor/base_productmonitor_rhi.html'

    test_context = {
                    'products' : Product.objects.all(),                   
                    }
    return render(request, template, test_context)

def information(request):
    template = 'productmonitor/base_information.html'
    context = {}
    return render(request, template, context)

def casedatabase(request):
    template = 'productmonitor/base_case-database.html'
    context = {}
    return render(request, template, context)

def contact(request):
    template = 'productmonitor/base_contact.html'
    context = {}
    return render(request, template, context)

base_productmonitor.html

{% extends "productmonitor/base.html" %}

{% block content %}
    <div class="productSelectMenu">
        <ul>
            <li><a href="{% url 'productmonitor:product' 'dualpol' %}">Dual pol<a/></li>
            <li><a href="{% url 'productmonitor:product' 'rhi' %}">Rhi<a/></li>
        </ul>
    </div>

    {% block productcontent %}
        <div id="productView" class="productView">
            <p>Default productView content</p>    
        </div>
    {% endblock %}
{% endblock %}

base_productmonitor_dualpol.html

{% extends "productmonitor/base_productmonitor.html" %}
{% block productcontent %}
<div id="productView" class="productView">
    <p>
        dualpol
    </p>
</div>
{% endblock %}

【问题讨论】:

  • 您是否将productmonitor 定义为包含的url 的命名空间?
  • 是的,我有:url(r'^productmonitor/', include('productmonitor.urls', namespace='productmonitor'))
  • 请检查您传递的 kwargs 是否与 url 正则表达式模式匹配。我看到错误的正则表达式与urls.py 中的正则表达式不同。

标签: javascript python html django


【解决方案1】:

我认为错误是说您的产品功能中的渲染没有得到正确的 &lt;product_name&gt; 使用。它表明它拥有的论点(它正在尝试的&lt;product_name&gt;)没有。因此,您在产品功能中要做的就是尝试并确保您确实获得了&lt;product_name&gt;

【讨论】:

  • 谢谢,我花了一段时间才找到错误,但它确实与未正确传递给视图的 kwargs 有关。我在问题中添加了代码的固定版本,不确定是否应该也删除旧版本。
  • @MrBronson 抱歉,如果我的回答有点令人困惑,我忘了用代码块说 &lt;product_name&gt;。很高兴我能帮上忙!
猜你喜欢
  • 2014-03-04
  • 1970-01-01
  • 1970-01-01
  • 2014-06-02
  • 1970-01-01
  • 1970-01-01
  • 2019-07-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多