Значение по умолчанию в поле Django AdminForm
У меня есть форма администратора Django. И теперь я хочу заполнить его начальное поле данными, основанными на моей модели. Итак, я попробовал это:
class OrderForm(forms.ModelForm):
class Meta:
model = Order
email = CharField(initial="null", widget=Textarea(attrs={'rows': 30, 'cols': 100}))
def __init__(self, *args, **kwargs):
self.request = kwargs.pop('request', None)
products = kwargs['instance'].products.all()
self.message = purchase_message % (
"".join(["<li>" + p.name + ": " + str(p.price) + "</li>" for p in products]),
reduce(lambda x, y:x + y.price, products, 0)
)
# and here I have a message in self.message variable
super(OrderForm, self).__init__(*args, **kwargs)
На данный момент я не знаю, как получить доступ к полю электронной почты, чтобы установить его начальное значение перед визуализацией виджета. Как я могу это сделать?
5 ответов
Я не слишком уверен, что вам нужно установить электронную почту, но вы можете установить начальные значения в разных местах.
Ваша функция def init() не имеет правильного отступа, который, я думаю, опечатка? Кроме того, почему вы специально даете в поле формы электронной почты TextInput? Он уже отображает этот виджет по умолчанию
Вы можете установить начальное значение письма в инициализированной форме (def __ init __ (self))
(self.fields['email'].widget).initial_value = "something"
или в model.py
email = models.CharField(default="something")
или как у вас есть в forms.py
email = models.CharField(initial="something")
Предполагая, что значение основано на "запросе", вы должны использовать это:
class MyModelAdmin(admin.ModelAdmin):
def get_form(self, request, obj=None, **kwargs):
form = super(MyModelAdmin, self).get_form(request, obj, **kwargs)
form.base_fields['my_field_name'].initial = 'abcd'
return form
Начиная с Django 1.7 есть функция get_changeform_initial_data
в ModelAdmin, который устанавливает начальные значения формы:
def get_changeform_initial_data(self, request):
return {'name': 'custom_initial_value'}
РЕДАКТИРОВАТЬ: Кроме того, ответ @Paul Kenjora применяется в любом случае, что может быть полезно, если вы уже переопределить get_form
,
В случае встроенного (InlineModelAdmin
) здесь нет get_changeform_initial_data
, Вы можете переопределить get_formset
и установить formset.form.base_fields['my_field_name'].initial
,
Мне нужно было первое решение пастилегов, так как остальные переписали весь виджет, включая, например, текст справки. Однако, это не сработало для меня, поскольку он отправил это. Вместо этого я должен был сделать это:
self.fields['email'].initial = 'something'
В моем случае я пытался выполнить персонифицированное автоинкремент (на основе текущих данных, а не простого значения по умолчанию) в поле формы администратора django.
Этот код работает для меня (Django 1.11):
from django import forms
class MyAdminForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.initial['field_name'] = 'initial_value'