下拉选择选项以过滤Django列表

下拉选择选项以过滤Django列表,django,django-models,django-forms,django-templates,django-views,Django,Django Models,Django Forms,Django Templates,Django Views,从Angular开始,这很容易做到,但我不确定从何处开始创建一个下拉表单,该表单将从对象列表中过滤。基本上,我有下面的代码,它将拉入并显示所有房地产清单;我想创建一个下拉列表,将有两个选择,“特色”和“新列表”,当用户选择一个时,列表将过滤掉,只显示匹配的列表。谢谢你的帮助 这是我的型号 from django.db import models from django.utils import timezone class Listing(models.Model): FAIR =

从Angular开始,这很容易做到,但我不确定从何处开始创建一个下拉表单,该表单将从对象列表中过滤。基本上,我有下面的代码,它将拉入并显示所有房地产清单;我想创建一个下拉列表,将有两个选择,“特色”和“新列表”,当用户选择一个时,列表将过滤掉,只显示匹配的列表。谢谢你的帮助

这是我的型号

from django.db import models
from django.utils import timezone


class Listing(models.Model):
    FAIR = 'FAIR'
    GOOD = 'GOOD'
    VERY_GOOD = 'VERY_GOOD'
    EXCELLENT = 'EXCELLENT'

    NEW_LISTING = 'NEW_LISTING'
    PRICE_REDUCED = 'PRICE_REDUCED'
    UNDER_AGREEMENT = 'UNDER_AGREEMENT'
    SOLD = 'SOLD'

    YES = 'YES'
    NO = 'NO'

    FULL_SERVICE = 'FULL_SERVICE'
    FOR_LEASE = 'FOR_LEASE'
    WITH_REAL = 'WITH_REAL'
    QUICK_SERVE = 'QUICK_SERVE'

    CONDITION_CHOICES = (
        ('FAIR', 'Fair'),
        ('GOOD', 'Good'),
        ('VERY_GOOD', 'Very Good'),
        ('EXCELLENT', 'Excellent'),
    )

    STATUS_CHOICES = (
        ('NEW_LISTING', 'New Listing'),
        ('PRICE_REDUCED', 'Price Reduced'),
        ('UNDER_AGREEMENT', 'Under Agreement'),
        ('SOLD', 'Sold'),
    )

    FEATURED_CHOICES = (
        ('YES', 'Yes'),
        ('NO', 'No'),
    )

    LOCATION_TYPE = (
        ('FULL_SERVICE', 'Full Service'),
        ('FOR_LEASE', 'For Lease'),
        ('WITH_REAL', 'With Real'),
        ('QUICK_SERVE', 'Quick Serve'),
    )

    photo = models.ImageField(upload_to="media/properties/", max_length=250, blank=True, null=True)
    broker = models.ForeignKey('auth.User')
    phone = models.CharField(max_length=20, null=True)
    title = models.CharField(max_length=250, null=True)
    description = models.TextField(null=True)
    concept = models.CharField(max_length=250, null=True)
    location = models.CharField(max_length=250, null=True)
    size = models.CharField(max_length=250, null=True)
    seating = models.CharField(max_length=250, null=True)
    condition_choices = models.CharField(max_length=20, choices=CONDITION_CHOICES, blank=True)
    hours = models.CharField(max_length=250, null=True)
    asking_price = models.CharField(max_length=250, null=True)
    sales_price = models.CharField(max_length=250, null=True)
    rent_price = models.CharField(max_length=250, null=True)
    lease_terms = models.CharField(max_length=250, null=True)
    licenses = models.CharField(max_length=250, null=True)
    parking = models.CharField(max_length=250, null=True)
    status_choices = models.CharField(max_length=20, choices=STATUS_CHOICES, blank=True, null=True)
    featured_choices = models.CharField(max_length=5, choices=FEATURED_CHOICES, blank=True, null=True)
    location_type = models.CharField(max_length=20, choices=LOCATION_TYPE, blank=True, null=True)
    created_date = models.DateTimeField(default=timezone.now, null=True)
    published_date = models.DateTimeField(default=timezone.now, null=True)

    listing_order = models.PositiveIntegerField(default=0, blank=False, null=False)

    class Meta(object):
        ordering = ('listing_order',)

    def publish(self):
        """This is a docstring"""
        self.published_date = timezone.now()
        self.save()

    def __str__(self):
        return self.title
这是我的模板

{% extends "listing/base.html" %}{% load staticfiles %}

{% block content %}

  <section class="listings mt64 mb64">
    <div class="container">
      {% for listing in listings %}
        <div class="row">
          <div class="col-md-4">
            <div class="listings-photo" style="background: #ccc url('{{ MEDIA_URL }}{{ listing.photo.name }}')no-repeat 50% 50%; background-size: cover; width: 350px; height: 220px"></div>
          </div>
          <div class="col-md-8">
            <h3 class="uppercase">{{ listing.title }}</h3>

            <p><span class="listings-title">Description:</span> {{ listing.description }}</p>

            <div class="row">
              <div class="col-md-6">
                <ul>
                  <li><span class="listings-title">Concept:</span> {{ listing.concept }}</li>
                  <li><span class="listings-title">Location:</span> {{ listing.location }}</li>
                  <li><span class="listings-title">Size:</span> {{ listing.size }}</li>
                  <li><span class="listings-title">Seating:</span> {{ listing.seating }}</li>
                  <li><span class="listings-title">Condition:</span> {{ listing.condition_choices }}
                  </li>
                  <li><span class="listings-title">Hours:</span> {{ listing.hours }}</li>
                </ul>
              </div>
              <div class="col-md-6">
                <ul>
                  <li><span class="listings-title">Asking Price:</span> {{ listing.asking_price }}
                  </li>
                  <li><span class="listings-title">Sales:</span> {{ listing.sales_price }}</li>
                  <li><span class="listings-title">Rent:</span> {{ listing.rent_price }}</li>
                  <li><span class="listings-title">Lease Terms:</span> {{ listing.lease_terms }}</li>
                  <li><span class="listings-title">Licenses:</span> {{ listing.licenses }}</li>
                  <li><span class="listings-title">Parking:</span> {{ listing.parking }}</li>
                </ul>
              </div>
            </div>
            <p>For more information please contact {{ user.first_name }} {{ user.last_name }} at {{ listing.phone }}.</p>
          </div>
        </div>
      {% endfor %}
    </div>
  </section>

{% endblock content %}
{%extends“listing/base.html”%}{%load staticfiles%}
{%block content%}
{%用于在清单%中列出}
{{listing.title}
描述:{{listing.Description}}

  • 概念:{{listing.Concept}
  • 位置:{{listing.Location}
  • 大小:{{listing.Size}
  • 座位:{{listing.seathing}
  • 条件:{listing.Condition_choices}
  • 小时数:{{listing.Hours}
  • 要价:{{listing.Asking_Price}
  • 销售:{listing.Sales_price}
  • 租金:{{listing.Rent\u price}
  • 租赁条款:{{listing.Lease_Terms}
  • 许可证:{{listing.Licenses}
  • 停车:{{listing.Parking}}
欲了解更多信息,请联系{{user.first_name}{{{user.last_name}}电话{{listing.phone}}

{%endfor%} {%endblock内容%}
我能从你的角度理解你的意思。在Django中,最经典的方法是创建一个包含所有所需字段的表单,然后将其传递给视图以处理数据、过滤记录并将其传递回模板。我将尝试提供一个基本示例,以便您有希望了解以下内容:

Index.html:

<form action="{% url 'index' %}" method="get">
    <label for="featured">Format</label>
    <select name="featured">
        <option value="Yes" />Yes</option>
        <option value="No" />No</option>
    <input type="submit" name="featured" value="Filter" />
</form>     

这是不言自明的。若GET中有一个“featured”参数,列表将被过滤,否则它将传递所有对象。很明显,我们正在关注每一个过滤请求的页面刷新,如果您希望获得更多的单页面体验,那么您必须使用ajax和post请求,或者其他方式。另外,请记住,这段代码只是一个硬编码的示例。理想情况下,您应该创建一个ModelForm类并实例化它,然后将其传递给模板——如果您有更多的过滤器字段,那么它的可读性和可维护性会更好。如果涉及到复杂的过滤,您可能还希望有一个用于过滤目的的附加视图,但这也很有效,它很快就会变得混乱。

感谢Zephi,您的提示对我帮助很大,但对我来说,只有在我将index.html更改为以下内容后,它才起作用:

index.html

<form action="{% url 'index' %}" method="get">
    <label for="featured">Format</label>
    <select name="featured">
        <option value="Yes" />Yes</option>
        <option value="No" />No</option>
    </select>   <!-- ADDED THIS LINE -->
    <input type="submit" value="Filter" />   <!-- DELETE name="featured" FROM ORIGINAL CODE -->  
</form>
<form action="{% url 'index' %}" method="get">
    <label for="featured">Format</label>
    <select name="featured">
        {% for adoption in typeList %} 
            <option value="{{ adoption }}">{{ adoption }}</option>
        {% endfor %}
     </select>
     <input type="submit" value="Filter" />
</form>

谢谢您花时间来帮助我,我会尝试一下并让您知道。您是否尝试使用ng change?我的意思是将两个选项之一(“特色”和“新列表”)发送到后端onchange。。
<form action="{% url 'index' %}" method="get">
    <label for="featured">Format</label>
    <select name="featured">
        {% for adoption in typeList %} 
            <option value="{{ adoption }}">{{ adoption }}</option>
        {% endfor %}
     </select>
     <input type="submit" value="Filter" />
</form>
def index(request, template_name='index.html'):
    if request.GET.get('featured'):
        featured_filter = request.GET.get('featured')
        query = Unit.listType.filter(unitType=featured_filter)
    else:
        query = Unit.listType.all()
    typeList = query.order_by('unitType').values_list('unitType',flat=True).distinct()
    _dict = {}
    for x in range(len(typeList)):
        _dict[typeList[x]] = typeList[x]
    return render(request, 'index.html', {'query':query, 'typeList':_dict})