2011-11-10 13 views
0

私はDjangoを使い慣れています。私は "python2.6/site-packages/haystack"にある外部アプリケーションをインストールしました。この外部アプリケーションには「汎用フォーム」がありますが、「汎用フォーム」にはないCSSクラスを追加する必要があります。Django - フォームを拡張するには?

"forms.py"という "class FacetedModelSearchForm"を "generic form"から "forms.py"まで自分のアプリケーションでどのように拡張できますか?ここで

は、「一般的な形式」からのコードです

class SearchForm(forms.Form): 
    q = forms.CharField(required=False, label=_('Search')) 

    def __init__(self, *args, **kwargs): 
     self.searchqueryset = kwargs.pop('searchqueryset', None) 
     self.load_all = kwargs.pop('load_all', False) 

     if self.searchqueryset is None: 
      self.searchqueryset = SearchQuerySet() 

     super(SearchForm, self).__init__(*args, **kwargs) 

    def no_query_found(self): 
     """ 
     Determines the behavior when no query was found. 
     By default, no results are returned (``EmptySearchQuerySet``). 
     Should you want to show all results, override this method in your 
     own ``SearchForm`` subclass and do ``return self.searchqueryset.all()``. 
     """ 
     return EmptySearchQuerySet() 

    def search(self): 
     if not self.is_valid(): 
      return self.no_query_found() 

     if not self.cleaned_data.get('q'): 
      return self.no_query_found() 

     sqs = self.searchqueryset.auto_query(self.cleaned_data['q']) 

     if self.load_all: 
      sqs = sqs.load_all() 

     return sqs 

    def get_suggestion(self): 
    if not self.is_valid(): 
     return None 

    return self.searchqueryset.spelling_suggestion(self.cleaned_data['q']) 


class FacetedSearchForm(SearchForm): 
    def __init__(self, *args, **kwargs): 
    self.selected_facets = kwargs.pop("selected_facets", []) 
    super(FacetedSearchForm, self).__init__(*args, **kwargs) 

    def search(self): 
    sqs = super(FacetedSearchForm, self).search() 

    # We need to process each facet to ensure that the field name and the 
    # value are quoted correctly and separately: 
    for facet in self.selected_facets: 
     if ":" not in facet: 
      continue 

     field, value = facet.split(":", 1) 

     if value: 
      sqs = sqs.narrow(u'%s:"%s"' % (field, sqs.query.clean(value))) 

    return sqs 

私は私のアプリ「forms.py」で、このクラスを拡張するCSSクラス「myspecialcssclass」フィールド「Q」に追加するにはどうすればよいですか?私が拡張する必要があるクラスは、 "FacetedSearchForm"です。すべての手がかりは?

答えて

3
from haystack.forms import FacetedSearchForm 

class CustomSearchForm(FacetedSearchForm) 
    q = forms.CharField(required=False, label='Search', widget=forms.widgets.TextInput(attrs={"class":"myspecialcssclass",})) 

カスタムフォームは、例えば、あなたの干し草の山のURLに設定する必要があります。

from haystack.views import SearchView 

urlpatterns = patterns('haystack.views', 
    url(r'^$', SearchView(form_class=CustomSearchForm, results_per_page=20), name='haystack_search'), 
) 

はまた、フォームフィールドウィジェットattrsマップのHTMLは、その値に属性干し草の山views and forms documentation

+0

ありがとうございました。出来た! –

1

を参照してください。サブクラス__init__のこれらの属性をオーバーライドして、フィールドを安全に変更します。

https://docs.djangoproject.com/en/dev/ref/forms/widgets/#customizing-widget-instances

役立つかもしれない:

class MyForm(FacedSearchForm): 
    def __init__(self, *args, **kwargs): 
     super(MyForm, self).__init__(*args, **kwargs) 
     self.fields['q'].widget.attrs['class'] = 'myspecialcssclass' 
2

私はこれはと思います。

基本的に、あなたは

class MyForm(FacetedSearchForm): 
    q = forms.CharField(
      required=False, 
      label='Search', 
      widget=forms.TextInput(attrs={'class':'myspecialcssclass'})) 

をウィジェットとそれはそれでなければなりませんFacetedSearchFormをサブクラス化し、あなたに引数を追加する必要があります。

+0

返事をありがとう。それは同様に動作します –

関連する問題