Django - как я могу получить доступ к полю формы из пользовательского виджета - PullRequest
9 голосов
/ 04 августа 2009

Данный класс унаследован от виджета Textarea и содержит код JavaScript, который отображает, сколько символов еще пользователь может ввести в текстовой области.

class TextAreaWithCharCounter(forms.Textarea):

    class Media:
        js = ('js/jquery.charcounter.js',)

    def render(self, name, value, attrs = None):
        id = attrs['id']
        max_length = self.attrs.get('max_length', 200)
        output = super(TextAreaWithCharCounter, self).render(name, value, attrs)
        output += mark_safe(u'''
                        <script type="text/javascript">
                        $("#%s").charCounter(%d, {classname:"charcounter"});
                        </script>'''%(id, max_length))        
        return output

Соответствующая часть кода формы выглядит следующим образом:

class MyForm(forms.Form):
    foo = forms.CharField(max_length = 200, widget = TextAreaWithCharCounter(attrs={'max_length':200}))
    ...

Вы можете видеть, что я передаю аргумент max_length дважды, один для поля и один для виджета. Лучшим способом может быть доступ к полю формы из виджета и получение его атрибута max_length, чтобы виджет не требовал аргумента max_length. Как я могу это сделать?

Ответы [ 2 ]

13 голосов
/ 26 января 2010

Хотя это и не требуется для решения вашей проблемы, иногда доступ к форме или полю формы может быть действительно полезным. См. Полный ответ на другой вопрос , но вкратце, вы можете привязать форму или поле к виджету вручную в форме __init__:

class MyForm(forms.ModelForm):
    foo = forms.ModelChoiceField(Foo.objects, widget=CustomWidget())

    class Meta:
        model = Bar

    def __init__(self, *args, **kwargs):
        super(MyForm, self).__init__(*args, **kwargs)
        self.fields['foo'].widget.form_instance = self
3 голосов
/ 04 августа 2009

Технически, виджет не обязательно должен иметь прямое отношение к полю, поэтому вы этого не делаете.

Глядя на источник CharField, вы можете увидеть, что у него есть метод widget_attrs, который автоматически добавляет атрибут maxlength в поля TextInput / PasswordInput.

Я предлагаю вам использовать настраиваемое поле, которое переопределяет этот метод и добавляет атрибут для вашего настраиваемого виджета.

Кроме того, я не уверен, что оставить его в attrs - хорошая идея, так как <TextArea> будет отображаться с недопустимым аргументом max_length. Возможно, вам стоит вместо этого 1011 * отключить?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...