Подтвердить что ты не робот

Установка начального значения поля формы Django в методе __init__

Django 1.6

У меня есть рабочий блок кода в классе формы Django, как показано ниже. Набор данных, из которого я создаю список полей формы, может включать начальное значение для любого из полей, и я не успеваю установить это начальное значение в форме. В приведенном ниже блоке if field_value: действительно заполняется атрибут исходного словаря формы, но начальное значение не отображается. Обратите внимание, что (в случае, если вам интересно) атрибут .initial не существует до тех пор, пока не будет вызван вызов super().

Можно ли это сделать?

Если да, то что я не делаю правильно, чтобы сделать эту работу?

Спасибо!

def __init__(self, *args, **kwargs):
    id = kwargs.pop('values_id', 0)
    super(LaunchForm, self).__init__(*args, **kwargs)
    # Lotsa code here that uses the id value
    # to execute a query and build the form
    # fields and their attributes from the 
    # result set

    if field_value:
        self.initial[field_name] = field_value
4b9b3361

Ответ 1

У меня была такая же проблема, и я решил это сделать:

def __init__(self, *args, **kwargs):
    instance = kwargs.get('instance', None)

    kwargs.update(initial={
        # 'field': 'value'
        'km_partida': '1020'
    })

    super(ViagemForm, self).__init__(*args, **kwargs)

    # all other stuff

Ответ 2

Попробуйте следующим образом:

super(ViagemForm, self).__init__(*args, **kwargs)

if field_value:
    #self.initial[field_name] = field_value
    self.fields[field_name].initial = field_value

Ответ 3

У меня была аналогичная проблема с установкой начального значения для переключателя с именем "needs_response" и его решения, проверяя собственные атрибуты и ссылаясь на "объявленные поля":

    # views.py
    def review_feedback_or_question(request, template, *args, **kwargs):
        if 'fqid' in kwargs:
            fqid = kwargs['fqid']
        submission = FeedbackQuestion.objects.get(pk=fqid)
        form = FeedbackQuestionResponseForm(submission_type=submission.submission_type)
        # other stuff

    # forms.py
    class FeedbackQuestionResponseForm(forms.Form):
        CHOICES = (('1', 'Yes'), ('2', 'No'))
        response_text = forms.CharField(
            required=False,
            label='',
            widget=forms.Textarea(attrs={'placeholder': 'Enter response...'}))
        needs_response = forms.ChoiceField(choices=CHOICES,
            label='Needs response?',
            widget=forms.RadioSelect())
        def __init__(self, *args, **kwargs):
            if 'submission_type' in kwargs:
                submission_type = kwargs.pop('submission_type')
                if submission_type == 'question':
                    self.declared_fields['needs_response'].initial = 1
                else:
                    self.declared_fields['needs_response'].initial = 2
            super(FeedbackQuestionResponseForm, self).__init__(*args, **kwargs)

Ответ 4

Это работает:

class BarForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['state'] = forms.ChoiceField(
            required=False,
            choices=Foo.ADDRESS_STATE_CHOICES,
            disabled='disabled',
            initial='xyz',
        )

    state = forms.ChoiceField(
        label='State',
        choices=Foo.ADDRESS_STATE_CHOICES,
        initial='foo',
    )

Ответ 5

Я хочу упомянуть, хотя это может не решить вашу проблему, что "начальный" dict kwarg, отправленный в форму, кажется, предпочитает более field['field_name'].initial.

class MyView(View):
    form = MyForm(initial={'my_field': 'first_value'})

class MyForm(Form):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['my_field'].initial = 'second_value'

my_field rendered будет иметь исходный набор 'first_value'.

Некоторые параметры (среди прочих) могут быть:

Определите second_value в представлении перед инициализацией формы:

class MyView(View):
    # determine second_value here
    form = MyForm(initial={'my_field': 'second_value'})

замените first_value на second_value в initial перед вызовом super():

class MyForm(Form):
    def __init__(self, *args, **kwargs):
        # determine second_value here
        if kwargs.get('initial', None):
            kwargs['initial']['my_field'] = 'second_value'
        super().__init__(*args, **kwargs)

Убедитесь, что 'first_value' не находится в kwargs['initial'] перед вызовом super():

class MyForm(Form):
    def __init__(self, *args, **kwargs):
        if kwargs.get('initial', None):
            if kwargs['initial']['my_field']
                del(kwargs['initial']['my_field']
        super().__init__(*args, **kwargs)
        # determine second_value here
        self.fields['my_field'].initial = 'second_value'