在django中应用列表过滤器时的最大递归深度

qvk1mo1f  于 2022-12-20  发布在  Go
关注(0)|答案(3)|浏览(134)

我正在尝试从django过滤器实现列表过滤器。第一个“type”是我希望我的过滤器基于的属性,在我的应用程序的models.py中。

class detaileditems(models.Model):
    title = models.CharField(max_length= 255)
    type = models.CharField(max_length= 45, null=True)
    pubdate = models.DateTimeField()
    body = models.TextField()
    image = models.ImageField(upload_to= 'images/')

我已经在应用程序中创建了一个单独的filters.py,并在其中调用了过滤器。

import django_filters
from .models import detaileditems
class ListingFilters(django_filters.FilterSet):
    class Meta:
        model = detaileditems
        fields = {'type': ['exact']}

接下来是我在views.py文件中的函数-

from .models import detaileditems
from .filters import ListingFilters
def alldetailed2(request):
    items = detaileditems.objects
    listing_filter = ListingFilters(request.GET, queryset=items)
    context = {
        'listing_filter' : listing_filter,
        'items': items,
    }
    return render(request, 'detailed2/detailed2.html',context)

最后在我的html文件“detailed 2. html”中,它位于“detailed 2”的应用程序模板文件夹中。

<div class = "col-lg-6 col-md-8 mx-auto">
    <form method = "get">
            {{ listing_filter.form }}
            <button class="btn btn-sm btn-danger" type="submit">Search</button>
         </form>
</div>
<div class = "container">
     <div class = "row row-cols-1 row-cols-sm2 row-cols-md-3 g-3">
          {% for listing in listing_filter.qs %}
          <div class = "col">
               {% include "detailed2/detailed2.html" %}
          </div>
           {% endfor %}
      </div>
</div>

我得到一个最大递归深度错误。

这里是我的文件夹结构,以便更好地理解。

xdnvmnnf

xdnvmnnf1#

有一篇关于最大递归深度的文章:earlier post
有时候可以通过重新思考算法来找到解决方案,例如使用列表迭代而不是递归。我猜你需要说服自己没有犯错误,然后向Django提交问题。
作为一个快速的解决方案,你可以尝试增加递归的深度。
我确实在html中看到了一个自引用:
“{%包含“详细信息2/detailed2.html”%}“
那会是你麻烦的根源吗?

mwg9r5ms

mwg9r5ms2#

我猜你错过了表单操作。当有一个关键字输入,然后表单提交应该调用相同的函数,因为你正在使用列出所有的文章。

<form method = "post" action="{% url 'alldetailed2' %}">
            <input type='text' name='articale_name' />
            <button class="btn btn-sm btn-danger" type="submit">Search</button>
         </form>

在查看功能中:

article_name = request.POST.get("articale_name")
if article_name:
    "filter model with article_name"
else:
    list out all the Articles same as earlier
zpqajqem

zpqajqem3#

在OP的views.py中,确保在OP获取项目时,其末尾为.all()

def alldetailed2(request):
    items = detaileditems.objects.all()
    listing_filter = ListingFilters(request.GET, queryset=items)
    context = {
        'listing_filter' : listing_filter,
        'items': items,
    }
    return render(request, 'detailed2/detailed2.html',context)

然后你就可以像这样在自己的模板中渲染

{% for detailed_item in listing_filter.qs %}
    <h2>{{ detailed_item.title }}</h2>
    <p>{{ detailed_item.body }}</p>
{% endfor %}

而不是

{% include "detailed2/detailed2.html" %}

请记住,还有guidelines in the way one names classes, functions, ...
Django的模型应该使用CapWords的约定,同时也考虑了anti-pattern to use model classes with a plural name,所以用DetailedItem代替detaileditems
函数名应该小写,单词之间用下划线分隔,例如all_detailed_2而不是alldetailed2

相关问题