【问题标题】:Issue using Messages in Django Template在 Django 模板中使用消息的问题
【发布时间】:2016-03-16 21:56:21
【问题描述】:

我是非常新的 Django 和一般的 Web 开发空间。在我的模板上,我列出了所有数据库条目,以及一个查询数据库并返回任何结果的搜索栏。当没有结果时,我需要帮助来显示消息。目前,当没有结果时,页面只是重新加载。我已经尝试实现messages framework,但我无法让它工作(似乎我必须将它定向到另一个页面)。在views.py 中,我有一个if 语句来决定当没有结果时要做什么,我只是不知道如何生成与查询出现在同一页面上的语句。我尝试过扩展模板,并将变量放在views.py 中,但它们会永久保留在页面中。我也考虑过 Javascript,但我还没有学过。我不喜欢使用 Haystack 或 DjangoSearch,因为我认为这很简单。如果您需要任何其他信息,请告诉我。非常感谢您的帮助!

我的意见.py

from django.http import Http404, HttpRequest
from django.contrib import messages
from vendor_db.models import Itemo
from django.db.models import Q
from django.shortcuts import HttpResponse, HttpResponseRedirect, render_to_response, render, redirect, get_object_or_404

def vendors(request):
    items = Itemo.objects.all()
    var_2 = request.GET.get("q")
    if var_2:
        items = items.filter(Vendor_Name__icontains=var_2)
    if not items:
        messages.info(request, "No Results Found")
        return none
        people
    else:
        items
    context = {
        'items': items,
    }
    return render(request, 'vendor_db/vendors.html', context,())

def vendors_detail(request, id):

    try:
        item = Itemo.objects.get(id=id)
    except Itemo.DoesNotExist:
        raise Http404('This item does not exist')
    return render(request, 'vendor_db/vendors_detail.html', {
        'item': item,
    })

我的供应商模板:

{% extends "base.html" %}
    {% block content %}
    {% load static %}
            <h2>All Vendors</h2>
            <h3>Search</h3>
            <form method='GET' action=''>
                <input type='text' name="q" placeholder='Search Vendors'/>
                <input type='submit' value='Search'/>
            </form>
            <form action="{% url 'vendors' %}"> 
                <input type="submit" value="Reset">
            </form>

    {% if messages %}
            {% for message in messages %}
                {{ message }}
            {% endfor %}
    {% endif %}

            <h3>Sort by:</h3>
                <a href="{% url 'product_name_asc' %}">Product Name</a>
            <ul>
                {% for stuff in items %}
                    <li>
                        <a href="{% url 'vendors_detail' stuff.id %}">
                        {{ stuff.Product_Name|capfirst }}
                        </a>
                    </li>
                {% endfor %}
            </ul>
{% endblock %}

urls.py

from django.conf.urls import include, url
from django.contrib import admin
from vendor_db import views

urlpatterns = [
    url(r'^vendors/$', views.vendors, name='vendors'),
    url(r'^vendors/(?P<id>\d+)/', views.vendors_detail, name='vendors_detail'),
]

【问题讨论】:

    标签: python django django-forms django-templates django-views


    【解决方案1】:

    我会这样做:

    def vendors(request):
        items = Itemo.objects.all()
        var_2 = request.GET.get("q")
        if var_2:
            items = items.filter(Vendor_Name__icontains=var_2)
    
        return render(request, 'vendor_db/vendors.html', {'items': items})
    

    在模板中你可以做到。

    {% if items %}
    ... item output ...
    {% else %}
    No Results Found
    {% endif %}
    

    【讨论】:

    • 非常感谢!这对我有用。我将“...项目输出...”留空,因为我的数据库已经显示了这些条目。但这正是我所需要的。赞!!
    • 没问题。记住要尽量保持简单。 Django 和 python 试图让它变得非常简单,所以少即是多。
    • 另外,......项目输出的想法......在我的示例中,您可以使用输出项目(如果存在)的模板代码,否则您可以将我的 if 语句更改为 if不是物品。并删除其他。
    • 你又完全正确了!相反,我将我的对象循环放在 if 语句中,这使得这种方式更多。以后我会尽量不让事情过于复杂竖起大拇指
    猜你喜欢
    • 2016-12-12
    • 2020-03-07
    • 2017-01-03
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    • 2011-03-21
    • 2012-05-14
    • 1970-01-01
    相关资源
    最近更新 更多