3

次のセットアップで django-filters の基本的な例を適用しました: models.py

class Shopper(models.Model):
    FirstName = models.CharField(max_length=30)     
    LastName = models.CharField(max_length=30)      
    Gender_CHOICES = (
        ('','---------'),
        ('Male','Male'),
        ('Female','Female'),
    )
    Gender = models.CharField(max_length=6, choices=Gender_CHOICES, default=None)
        School_CHOICES = (
        ('','---------'),
        (u'1', 'Primary school'),
        (u'2', 'High School'),
        (u'3', 'Apprenticeship'),
        (u'4', 'BsC'),
        (u'5', 'MsC'),
        (u'6', 'MBA'),
        (u'7', 'PhD'),
    )
    HighestSchool = models.CharField(max_length=40, blank = True, choices = School_CHOICES,default=None)

ビュー.py:

def shopperlist(request):
    f = ShopperFilter(request.GET, queryset=Shopper.objects.all())
    return render(request,'mysapp/emailcampaign.html', {'filter': f})

urls.py:

   url(r'^emailcampaign/$', views.shopperlist, name='EmailCampaign'),

テンプレート:

{% extends "basewlogout.html" %}

{% block content %}
{% csrf_token %}
    <form action="" method="get">
    {{ filter.form.as_p }}
    <input type="submit" name="Filter" value="Filter" />
    </form>

        {% for obj in filter %}
            <li>{{ obj.FirstName }} {{ obj.LastName }} {{ obj.Email }}</li>
        {% endfor %}

       <a href="{% url 'UserLogin' %}"> 
       <p> Return to home page. </p> </a>
{% endblock %}

フォーム.py:

class ShopperForm(ModelForm):

    class Meta:
        model = Shopper

('','---------')フィルタリング中に django-filters がそれを表示し、そのフィールドが指定されないようにするために、空の選択肢が追加されました。ただし、非必須HighestSchoolフィールドの場合、作成シナリオでモデルを使用する場合に 2 回表示されます。つまり、非ModelForm.必須フィールド('','---------')にリストされるべきではありません。次に、フィルタリング中に empty_label を選択できません...

ビューの作成中に 1 つの empty_label をリストし、フィルタリング中に必須フィールドと非必須フィールドの両方を未指定のままにしておくことで、これをどのように解決できますか?

4

2 に答える 2

0

経験の浅い方のために、cvk77 による元の回避策の Python3 互換バージョンを次に示します。これは、@Serafeim によって受け入れられた回答で見つかりました。

class NicerFilterSet(django_filters.FilterSet):

def __init__(self, *args, **kwargs):
  super(NicerFilterSet, self).__init__(*args, **kwargs)

  for name, field in self.filters.items():
    if isinstance(field, ChoiceFilter):
      # Add "Any" entry to choice fields.
      field.extra['choices'] = tuple([("", "Any"), ] + list(field.extra['choices']))

変更点:

  • self.filters.iteritems()に変更されましたself.filters.items()
  • 誤ったバックティックを削除します(githubスレッドにも存在していました-@Serafeimのせいではありません)
于 2016-10-11T03:48:32.623 に答える