2013-04-28 1 views
0

내가 범주 또는 날짜별로 선택적으로 필터링하고 싶은 나는 항목이 블로그가 가정 :필터링 양식 디자인

#views.py 

blog_entries = Blog.objects.all() 
cat_filter = TurnoverFilterForm(request.GET) 
    if cat_filter.is_valid(): 
     categories_chosen = cat_filter.cleaned_data['categories'] 
     start_date = cat_filter.cleaned_data['start_date'] 
     end_date = cat_filter.cleaned_data['end_date'] 
     blog_entries = blog_entries.cat_filter(categories_chosen).date_filter(start_date,end_date) 
return render(request,'index.html',{'blog_entries':blog_entries} 
: 나는 다음과 같은 형식을 사용하는 필터의 경우

#forms.py 

class MyForm(forms.Form): 
    categories = forms.ModelMultipleChoiceField(Category.objects.all(), 
               required=False) 
    start_date = forms.DateField(required=False) 
    end_date = forms.DateField(required=False) 

내가 가지고 다음 뷰를했습니다

여기에서 date_filtercat_filter은 (작동하는) 사용자 정의 관리자 기능입니다.

질문은 다음과 같습니다

  1. 는 정말 옵션 형태로 각 필드를해야합니까? 이 경우에 대한 선택적 형식이 있습니까? (코드 중복성이 많기 때문에)
  2. 양식이 항상 유효하거나 양식이 항상 유효하고 날짜 범위가 선택 사항이고 양식의 요청 유형이 ' ? 문제가 이런 종류의 다른 어떤 우아한 해결책이 있습니까 '
  3. 를 얻을 당신이 선택 될 폼의 모든 필드를 원하는 경우에 당신이의 __init__ 기능을 무시할 수 있습니다
+0

양식이 항상 유효한 것은 아닙니다. 내가 지정한 카테고리가 아닌 카테고리 또는 날짜 형식이 아닌 날짜로 요청을 보내면 어떻게됩니까? – Xymostech

+0

둘 다'date_filter'와'cat_filter'에 잡힌다. – ProfHase85

+0

나는 포인트 번호 2를 모른다. 나는 못생긴'if'를 보지 못했다. 'views.py'에있는 것입니까? –

답변

2

나는 정말 흔히 상상할 수있는 형태 :

def __init__(self, *args, **kwargs): 
    super(forms.Form, self).__init__(*args, **kwargs) 
    for f in self.fields: 
     self.fields[f].required=False 

그런 식으로 모든 필드의 필수 필드를 False로 설정하고 코드 중복성을 방지하여 전체 양식을 선택적으로 만들 수 있습니다.

마찬가지로 is_valid 메서드는 True을 반환합니다. 코드에서 코드를 제거하고 나머지 코드를 캡슐화하는 다른 함수를 추가 할 수 있습니다. views.py.

이 코드를 사용하면 약간의 코드를 단순화 할 수 있습니다. 당신이 뭔가를 좋아한다면 양식 클래스의 서브 클래스를 생각하고 OptionalForm을 만들면 코드를 재사용 할 수 있습니다.

+0

이 경우'is_valid' 메소드를 제거 할 수 없습니다. 그렇지 않으면 내 양식에'cleaned_data'가 없기 때문입니다. 나는 이것이 매우 흥미 롭다 : 이것은 이런 종류의 일을 수행하는 일반적인 방법인가?) 이런 종류의 문제가 더 많이 있다고 상상할 수 있습니다.) – ProfHase85

+1

글쎄, 나는 장고의 모범 사례에서 기관이 아니지만 상당히 큰 틀에도 불구하고 끝점의 모든 가능한 단일 목적을위한 클래스가 없다고 생각한다. 사용자. 모든 프레임 워크와 마찬가지로 때때로 개발자는 아름답고 유용한 솔루션을 얻으려면 영리한 코딩을해야합니다 :) PS : 당신은'is_valid'에 대한 것이지만 아직도'if ': P –