Если я могу предложить альтернативный подход:
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
Можно объявить атрибут на Вашем 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...
Ну, при создании пользовательского образцового поля только для изменения это - виджет формы по умолчанию, не действительно очевидное место для запуска.
можно сделать собственный виджет формы и переопределить поле в форме, определив собственный виджет как в ответе Soviut.
существует также более короткий путь:
class ArticleForm(ModelForm):
pub_date = DateField(widget=MyDateWidget())
class Meta:
model = Article
существует пример того, как записать виджеты формы, это находится где-нибудь в пакете форм Django. Это - datepicker с 3, выпадает.
, Что я обычно делаю, когда я просто хочу добавить, некоторый JavaScript к стандартному элементу ввода HTML является отпуском это способ, которым это, и измените его путем ссылки, это - идентификатор позже с JavaScript. Можно легко поймать соглашение о присвоении имен для идентификаторов полей ввода, которые генерирует Django.
можно также просто обеспечить класс для виджета при переопределении его в форме. Тогда поймайте их всех с jQuery именем класса.
Эта статья помогла мне многочисленные времена.
суть его включает переопределение 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
Вы действительно хотите определить пользовательский виджет и использовать виджет внутренний класс Медиа для определения JS (и CSS?) файлы, которые должны быть включены в страницу для виджета для работы. Если Вы делаете это правильно, можно сделать виджет абсолютно автономным и допускающим повторное использование. См. django-markitup для одного пример выполнения этого (он имеет допускающий повторное использование виджет для MarkItUp! универсальный редактор разметки ).
Тогда использование formfield_callback (см. ответ James Bennett) легко применять тот виджет ко всему DateField в форме.
Я использую 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}}