40

姜戈 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
4

6 回答 6

41

我有同样的问题,我解决了这个问题:

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
于 2014-11-12T13:12:18.427 回答
22

试试这个方法:

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

if field_value:
    #self.initial[field_name] = field_value
    self.fields[field_name].initial = field_value
于 2014-03-13T20:52:24.540 回答
7

我想提一下,尽管这可能无法解决您的问题,但发送到表单的“初始” 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渲染的初始设置为'first_value'.

一些选项(除其他外)可能是:

second_value在初始化表单之前在视图中确定:

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

在调用之前替换first_valuesecond_valuein :initialsuper()

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'
于 2017-10-04T17:44:56.117 回答
0

字段定义中的makeinitial= ""将解决您的问题。两种建议的方法都是正确的,您只需initial= ""在字段定义中定义即可解决问题

于 2020-05-09T18:04:38.960 回答
0

我在为名为“needs_response”的单选按钮设置初始值时遇到了类似的问题,并通过检查自我的属性并引用“declared_fields”来解决它:

    # 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)
于 2015-12-03T04:35:55.447 回答
0

这有效:

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',
    )
于 2017-07-31T19:57:35.613 回答