Python 在Django中,如何使用html页面列出数据库中具有公共属性的所有对象?

Python 在Django中,如何使用html页面列出数据库中具有公共属性的所有对象?,python,html,django,sqlite,Python,Html,Django,Sqlite,首先,我是这个领域的新手,所以如果我错过了任何必要的细节,请一定要让我知道,我会尽快更新 使用Django框架和SQLite数据库,我希望有两个html页面,列出具有相同“type”属性的所有项目 现在models.py看起来是这样的(后面还有更多属性,但我认为这并不重要): 因此,我希望其中一个html页面列出带有“med”的所有项目,另一个页面列出带有“cul”的所有项目 我尝试编写类似于搜索函数的内容,通过过滤该属性来显示这些项目,如下所示: def medicinal(request):

首先,我是这个领域的新手,所以如果我错过了任何必要的细节,请一定要让我知道,我会尽快更新

使用Django框架和SQLite数据库,我希望有两个html页面,列出具有相同“type”属性的所有项目

现在models.py看起来是这样的(后面还有更多属性,但我认为这并不重要):

因此,我希望其中一个html页面列出带有“med”的所有项目,另一个页面列出带有“cul”的所有项目

我尝试编写类似于搜索函数的内容,通过过滤该属性来显示这些项目,如下所示:

def medicinal(request):
    items = Articulo.objects.filter(tipo__icontains=med)
    return render(request, 'medicinales.html', {'articulos': articulos})
<a href="{% url 'articulo-list' %}?q=med">Med List</a>
然而,我真的不知道如何继续下去

我还希望在列表显示后将CSS添加到列表中,但为此,我将复制用于搜索功能的CSS,因为我希望它们保持相同的样式


再次感谢您,如果我遗漏了一些重要信息,请告诉我。

您不需要使用两个视图来完成此操作,您可以定义一个ListView,然后通过在视图中定义一个
get\u queryset
函数来过滤列表中显示的数据。下面是一个简单的示例,让您了解:

url.py

path(r'list/', ArticuloListView.as_view(), name='articulo-list')
views.py

class ArticuloListView(ListView):
    model = Articulo
    context_object_name = 'articulos'
    template = 'artucilo_list.html' #this path may differ depending on your project structure

    def get_queryset(self):
        search_term = self.request.GET['q'] #'q' is defined in your search form
        return Articulo.objects.filter(tipo=search_term)

搜索模板

...
<form action="{% url 'articulo-list' %}" method='GET'>
  <input name="q" type="text" value="{{ request.GET.q }}" placeholder="Search"/>
</form>
...
您不必根据搜索表单进行筛选,也可以使用链接href中的querystring手动进行筛选,如下所示:

def medicinal(request):
    items = Articulo.objects.filter(tipo__icontains=med)
    return render(request, 'medicinales.html', {'articulos': articulos})
<a href="{% url 'articulo-list' %}?q=med">Med List</a>

我按照iri的建议,通过使用queryset成功地完成了这项工作,但方法更简单

在URL.py中

path('medicinales/', productos_med, name='medicinales'),
在views.py中:

def productos_med(request):
    queryset = Articulo.objects.filter(tipo='med')
    context = {
        "object_list": queryset
    }
    return render(request, "medicinales.html", context)
在medicinales.html(包含所有“med”对象列表的页面)中:

{对象列表%中的实例%}
{{instance.nombre}

{{instance.description}}

然后,对于属性为“cul”的对象,我按照相同的步骤将queryset中的tipo更改为“cul”,并呈现不同的html页面。在那之后,应用CSS很容易


非常感谢iri的回答并为我指明了正确的方向,感谢社区提供了如此棒的信息来源

首先,谢谢你这么快的回复。我一直在努力解决这个问题,但运气不好。我能够将url.py和views.py中的行与我的项目对齐。在views.py中,我必须导入以下内容:
来自django.views.generic.list import ListView
我不确定搜索表单会去哪里,所以我选择了a href链接。然而,我得到了一个多值DictKeyError,异常值为'med',或者是'q'的位置。我怀疑这是因为我跳过了搜索表单,所以我尝试将它放在“medicinales.html”(应该放在“med”列表中)中,但我得到了相同的错误。
{% for instance in object_list %}
    <p>{{instance.nombre}}</p>
    <p>{{instance.descripcion}}</p> <!-- And so on for every wished attribute. -->