Как Вы изменяете виджет по умолчанию для всех полей даты Django в ModelForm?

Если я могу предложить альтернативный подход:

from sys import argv
option_handle_list = ['--script', '--lira_cbt', '--eur_hedge']
options = {}
for option_handle in option_handle_list:
    options[option_handle[2:]] = argv[argv.index(option_handle) + 1] if option_handle in argv else None
if options['eur_hedge'] == None:
    #Do x
else:
    #Do y
39
задан Brian M. Hunt 19 March 2009 в 13:06
поделиться

5 ответов

Можно объявить атрибут на Вашем ModelForm класс, названный formfield_callback. Это должно быть функцией, которая берет экземпляр модели Field Django в качестве аргумента и возвращает форму Field экземпляр для представления его в форме.

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

Так, что-то как:

def make_custom_datefield(f):
    if isinstance(f, models.DateField):
        # return form field with your custom widget here...
    else:
        return f.formfield()

class SomeForm(forms.ModelForm)
    formfield_callback = make_custom_datefield

    class Meta:
        # normal modelform stuff here...
56
ответ дан James Bennett 23 September 2019 в 17:52
поделиться

Ну, при создании пользовательского образцового поля только для изменения это - виджет формы по умолчанию, не действительно очевидное место для запуска.

можно сделать собственный виджет формы и переопределить поле в форме, определив собственный виджет как в ответе Soviut.

существует также более короткий путь:

class ArticleForm(ModelForm):
     pub_date = DateField(widget=MyDateWidget())

     class Meta:
         model = Article

существует пример того, как записать виджеты формы, это находится где-нибудь в пакете форм Django. Это - datepicker с 3, выпадает.

, Что я обычно делаю, когда я просто хочу добавить, некоторый JavaScript к стандартному элементу ввода HTML является отпуском это способ, которым это, и измените его путем ссылки, это - идентификатор позже с JavaScript. Можно легко поймать соглашение о присвоении имен для идентификаторов полей ввода, которые генерирует Django.

можно также просто обеспечить класс для виджета при переопределении его в форме. Тогда поймайте их всех с jQuery именем класса.

6
ответ дан Peter Mortensen 23 September 2019 в 17:52
поделиться

Эта статья помогла мне многочисленные времена.

суть его включает переопределение ModelForm __init__ метод, затем называя суперкласс __init__ метод, затем корректируя поля индивидуально.

class PollForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(PollForm, self).__init__(*args, **kwargs)
        self.fields['question'].widget = forms.Textarea()

    class Meta:
        model = Poll

Этот метод может казаться более сложным, чем Vasil, но он предлагает дополнительную выгоду способности точно переопределить любой атрибут на поле, не сбрасывая никакие другие атрибуты путем переобъявления этого.

ОБНОВЛЕНИЕ: Предложенный подход мог быть обобщен для изменения всех полей даты, не вводя каждое имя строго:

from django.forms import fields as formfields
from django.contrib.admin import widgets

class PollForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(PollForm, self).__init__(*args, **kwargs)
        for field_name in self.fields:
            field = self.fields[field_name]
            if isinstance(field, formfields.DateField):
                field.widget = widgets.AdminDateWidget()

    class Meta:
        model = Poll

Это работало на меня на python3 и django 1.11

6
ответ дан Rustam Guliev 23 September 2019 в 17:52
поделиться

Вы действительно хотите определить пользовательский виджет и использовать виджет внутренний класс Медиа для определения JS (и CSS?) файлы, которые должны быть включены в страницу для виджета для работы. Если Вы делаете это правильно, можно сделать виджет абсолютно автономным и допускающим повторное использование. См. django-markitup для одного пример выполнения этого (он имеет допускающий повторное использование виджет для MarkItUp! универсальный редактор разметки ).

Тогда использование formfield_callback (см. ответ James Bennett) легко применять тот виджет ко всему DateField в форме.

1
ответ дан Carl Meyer 23 September 2019 в 17:52
поделиться

Я использую JQuery. Вам нужно только найти «id» полей, которые вы хотите связать с инструментом выбора даты, и связать их с JQuery и правильным форматом отображения:

models.py

class ObjectForm(ModelForm):
    class Meta:
        model = Object        
        fields = ['FieldName1','FieldName2']

вверху страницы, с которой вы визуализируете ваше мнение:

<head>
    <link type="text/css" href="/media/css/ui-darkness/jquery-ui-1.8.2.custom.css" rel="Stylesheet" /> 
    <script type="text/javascript" src="/media/js/jquery-1.4.2.min.js"></script>
    <script type="text/javascript" src="/media/js/jquery-ui-1.8.2.custom.min.js"></script>
</head>
<script type="text/javascript">
 $(function() {
        $("#id_FieldName1").datepicker({ dateFormat: 'yy-mm-dd' });
        $("#id_FieldName2").datepicker({ dateFormat: 'yy-mm-dd' });
 });
</script>
...
{{form}}
3
ответ дан 27 November 2019 в 02:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: