【问题标题】:How to create a a checkbox/radiobutton for every choice of an attrubute using django-filter如何使用 django-filter 为属性的每个选择创建一个复选框/单选按钮
【发布时间】:2020-10-14 15:48:47
【问题描述】:

我有一个模特Property

class Property(models.Model):

PROPERTY_CATEGORIES = (
('flat/apartment 1BHK','flat/apartment 1BHK'),
('flat/apartment 2BHK','flat/apartment 2BHK'),
('flat/apartment 3BHK','flat/apartment 3BHK'),
('house','house'),
('pg/hostel +1 mate','pg/hostel +1 mate'),
('pg/hostel +2 mate','pg/hostel +2 mate'),
('pg/hostel +3 mate','pg/hostel +3 mate'),
('pg/hostel +4 mate','pg/hostel +4 mate'),    
)

name        = models.CharField(max_length=200)
proptype    = models.CharField(max_length=100, choices=PROPERTY_CATEGORIES)

我的 filters.py 看起来像这样

import django_filters
from .models import Property
from django.db import models
from django import forms

class PropertyFilter(django_filters.FilterSet):
    PROPERTY_CATEGORIES = (
    ('flat/apartment 1BHK','flat/apartment 1BHK'),
    ('flat/apartment 2BHK','flat/apartment 2BHK'),
    ('flat/apartment 3BHK','flat/apartment 3BHK'),
    ('house','house'),
    ('pg/hostel +1 mate','pg/hostel +1 mate'),
    ('pg/hostel +2 mate','pg/hostel +2 mate'),
    ('pg/hostel +3 mate','pg/hostel +3 mate'),
    ('pg/hostel +4 mate','pg/hostel +4 mate'),    
    )
    proptype = django_filters.ChoiceFilter(choices=PROPERTY_CATEGORIES)
    class Meta:
        model = Property
        fields = ['proptype']
        filter_overrides = {
                         models.CharField:{
                 'filter_class' : django_filters.ChoiceFilter,
                 'extra' : lambda f: {
                     'widget' : 'forms.CheckboxInput'
                 }
             }
        }

我的html文件是

{% block content %}
    <form method="get">
        <!-- {{ filter.form.as_p }} -->
        {% for choice in filter.form.proptype %}
        {{ choice.choice_label }}
        <span class="radio">{{ choice.tag }}</span>
        {% endfor %}
        <input type="submit" />
    </form>
    {% for obj in filter.qs %}
        {{ obj }} <br />
    {% endfor %}
{% endblock %}

我想将选项显示为单选按钮或复选框

喜欢 a list of categories like house, flat etc like with radiobuttons to select them

但我找不到方法,请帮忙

【问题讨论】:

    标签: python django django-forms django-filter django-widget


    【解决方案1】:

    forms.CheckboxInput 只呈现一个结帐,主要用于布尔(真或假)选择。您需要改用forms.CheckboxSelectMultipleforms.RadioSelect

    class PropertyFilter(django_filters.FilterSet):
        ...
        proptype = django_filters.ChoiceFilter(choices=PROPERTY_CATEGORIES)
        class Meta:
            model = Property
            fields = ['proptype']
            filter_overrides = {
                models.CharField:{
                     'filter_class' : django_filters.ChoiceFilter,
                     'extra' : lambda f: {
                          #'widget' : forms.RadioSelect
                          'widget' : forms.CheckboxSelectMultiple
                     }
                 }
            }
    

    进一步定制 您可以使用自定义或builtin widgets 并传递placeholder, class 之类的属性来控制表单的外观,它与表单具有相同的API。在内部,Filter 类将默认表单 Field 作为类属性,将在 Filter 上定义的与表单相关的参数传递给表单 Field 以呈现 HTML。

    例如:

    from django.forms.widgets import Input
    
    django_filters.CharFilter(label='name_starts', method=filter_name_starts, 
        widget = Input(attrs={'placeholder':'filter by first letter...', 'class': 'form-control'}))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-14
      • 2020-10-15
      • 1970-01-01
      • 1970-01-01
      • 2015-10-12
      • 2017-09-30
      • 2016-09-24
      • 1970-01-01
      相关资源
      最近更新 更多