2016-04-26 149 views
0

我已經使用了庫django-filter,它默認支持自己的過濾器表單。我使用模板中的{{filter.form}}將其打印出來。有沒有一種方法可以根據我自己的需要進行配置和自定義,這樣我就不會採用「Φ」這個詞,而是其他的東西?django-filter更改默認表單外觀

enter image description here

回答

0

我面對這個問題也,我的解決辦法如下:

filters.py:

from django import forms 
from django.utils.translation import ugettext as _ 
from django.forms.utils import flatatt 
from django.contrib.auth.models import User 
from .models import Zone, Location, Note, Price, Item, Unit, Category 
import django_filters 

class PriceFilter(django_filters.FilterSet): 
    STATUS_CHOICES = (
     (0, _('Pending')), 
     (1, _('Approved')), 
     (2, _('Deleted')), 
    ) 

    location = django_filters.ModelChoiceFilter(queryset=Location.objects.all(), widget=forms.Select(attrs={'class': 'form-control form-control-sm'})) 
    item = django_filters.ModelChoiceFilter(queryset=Item.objects.all(), widget=forms.Select(attrs={'class': 'form-control form-control-sm'})) 
    user = django_filters.ModelChoiceFilter(queryset=User.objects.all(), widget=forms.Select(attrs={'class': 'form-control form-control-sm'})) 
    status = django_filters.ChoiceFilter(choices=STATUS_CHOICES, widget=forms.Select(attrs={'class': 'form-control form-control-sm'})) 
    date = django_filters.DateFromToRangeFilter(widget=django_filters.widgets.RangeWidget(attrs={'class': 'datepicker form-control form-control-sm', 'placeholder': 'YYYY-MM-DD'})) 
    class Meta: 
     model = Price 
     fields = ('location', 'item', 'unit', 'date', 'status', 'user', 'approved',) 

views.py:

from django.shortcuts import get_object_or_404, render, redirect 
from django.urls import reverse 
from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin 
from django.views import generic, View 
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger 
from django.db.models import Count 
from .models import Zone, Location, Note, Price, Item, Unit, Category 
from .forms import NoteForm 
from .filters import PriceFilter 
... 
class IndexView(generic.ListView): 
    template_name = 'price/index.html' 

    def get(self, request): 
     price_list = Price.objects.all().order_by('-date').annotate(num_notes=Count('note')) 
     price_filter = PriceFilter(request.GET, queryset=price_list) 
     paginator = Paginator(price_filter.qs, 30) 
     page = request.GET.get('page') 
     try: 
      prices = paginator.page(page) 
     except PageNotAnInteger: 
      prices = paginator.page(1) 
     except EmptyPage: 
      prices = paginator.page(paginator.num_pages) 

     index = paginator.page_range.index(prices.number) 
     max_index = len(paginator.page_range) 
     start_index = index - 5 if index >= 5 else 0 
     end_index = index + 5 if index <= max_index - 5 else max_index 
     page_range = paginator.page_range[start_index:end_index] 

     return render(request, self.template_name, { 
      'prices': prices, 
      'filter': price_filter.form, 
      'page_range': page_range, 
     }) 

的index.html :

{% extends "base/base.html" %} 
{% load i18n %} 
{% load mptt_tags %} 
{% block content %} 

<div class="card border-light mb-3"> 
    <div class="card-header">{% trans 'Filter' %}</div> 
    <div class="card-body"> 
    <form method="get"> 
    <div class="form-row"> 
     <div class="form-group col-md-2"> 
     <label for="inputEmail4" class="col-form-label">{% trans 'Item' %}</label> 
     {{ filter.item }} 
     </div> 
     <div class="form-group col-md-2"> 
     <label for="inputEmail4" class="col-form-label">{% trans 'Location' %}</label> 
     {{ filter.location }} 
     </div> 
     <div class="form-group col-md-2"> 
     <label for="inputEmail4" class="col-form-label">{% trans 'Author' %}</label> 
     {{ filter.user }} 
     </div> 
     <div class="form-group col-md-3"> 
     <label for="inputEmail4" class="col-form-label">{% trans 'Date' %}</label> 
     <div class="input-group mb-3 mb-sm-0"> 
     {{ filter.date }} 
     </div> 
     </div> 
     <div class="form-group col-md-2"> 
     <label for="inputEmail4" class="col-form-label">{% trans 'Status' %}</label> 
     {{ filter.status }} 
     </div> 
     <div class="form-group col-md-1"> 
     <label for="inputEmail4" class="col-form-label">{% trans 'Actions' %}</label> 
     <button type="submit" class="btn btn-sm btn-primary">{% trans 'Filter' %}</button> 
     </div> 
    </div> 
    </form> 
    </div> 
</div> 

你可以像Django的窗體一樣使用過濾器,但它也有一些特定的小部件。我建議你檢查文件: https://django-filter.readthedocs.io/en/develop/ref/filters.html#widget