Значение по умолчанию в поле 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'
Другие вопросы по тегам