Джанго - Как продлить форму? - PullRequest
0 голосов
/ 10 ноября 2011

Я новичок в Джанго.Я установил внешнее приложение, которое находится в "python2.6 / site-packages / haystack".Это внешнее приложение имеет "универсальные формы", но мне нужно добавить класс CSS, который не находится в "универсальной форме".

Как я могу расширить "forms.py" для класса FacetedModelSearchForm "из"универсальная форма "to" 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

Как добавить в поле" q "Класс CSS «myspecialcssclass», расширяющий этот класс в моем приложении «forms.py»?Класс, который мне нужно расширить, это "FacetedSearchForm".Любые подсказки?

Ответы [ 3 ]

3 голосов
/ 10 ноября 2011
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'),
)

Также см. Документацию по стогу сена .

2 голосов
/ 10 ноября 2011

Я думаю, что это:

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

может помочь.

По сути, вам нужно создать подкласс FacetedSearchForm и добавить аргумент к вашему виджету

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

И это должно быть.

1 голос
/ 10 ноября 2011

Виджет поля формы attrs отображает атрибуты html на их значения.Переопределите эти атрибуты в функции подклассов __init__, чтобы безопасно изменить поле.

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