Передать начальное значение для модели в django - PullRequest
10 голосов
/ 22 сентября 2011

Как передать начальное значение поля в форму модели. У меня есть что-то вроде следующего кода

class ScreeningForm(forms.ModelForm):
    class Meta:
        model = Screening

    def __init__(self, *args, **kwargs):
        super(ScreeningForm, self).__init__(*args, **kwargs)
        self.fields['blood_screen_type'] =  CommaSeparatedCharField(
            label=self.fields['blood_screen_type'].label,
            initial=self.fields['blood_screen_type'].initial,
            required=False,
            widget=CommaSeparatedSelectMultiple(choices=BLOOD_SCREEN_TYPE_CHOICES)
        )

class ScreeningAdmin(admin.ModelAdmin):
    #form = ScreeningForm
    form = ScreeningForm(initial={'log_user':get_current_user()})

Теперь я хочу передать начальное значение для поля класса Person. Как я могу это сделать?

Ответы [ 3 ]

10 голосов
/ 22 сентября 2011

Вы можете передать начальное значение в ModelForm следующим образом:

form = PersonForm(initial={'fieldname': value})

Например, если вы хотите установить начальные значения age на 24 и name на "John Doe":

form = PersonForm(initial={'age': 24, 'name': 'John Doe'})

Обновление

Я думаю, что это отвечает на ваш актуальный вопрос:

def my_form_factory(user_object):
    class PersonForm(forms.ModelForm):
        # however you define your form field, you can pass the initial here
        log_user = models.ChoiceField(choices=SOME_CHOICES, initial=user_object)
        ...
    return PersonForm

class PersonAdmin(admin.ModelAdmin):
    form = my_form_factory(get_current_user())
7 голосов
/ 05 февраля 2015

В случае, если кому-то все еще интересно, для установки начальных значений для формы администратора можно выполнить следующие действия:

class PersonAdmin(admin.ModelAdmin):
    def get_form(self, request, obj=None, **kwargs):
        form = super(PersonAdmin, self).get_form(request, obj=obj, **kwargs)
        form.base_fields['log_user'].initial = get_current_user()
        return form

Обратите внимание, что вы также можете установить начальные значения с помощью параметров URL: например, / admin /человек / добавить? log_user = я

7 голосов
/ 22 сентября 2011

Поскольку ваша ModelForm связана с Person-Model, вы можете передать Person-Instance:

form = PersonForm(instance=Person.objects.get(foo=bar)

или перезапишите init-метод ModelForm:

class PersonForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
       super(PersonForm, self).__init__(*args, **kwargs)
       self.fields['foo'].value = 'bar'

    class Meta:
        model = Person
        exclude = ['name']

Это не проверено. Я не уверен, правильно ли указано «value», у меня нет Django-Installation, но в основном это так.

...