在__init__方法中设置初始Django表单字段值

Ste*_*yer 34 python django django-1.6

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
Run Code Online (Sandbox Code Playgroud)

Vic*_*nes 29

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

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
Run Code Online (Sandbox Code Playgroud)


ndp*_*dpu 21

试试这种方式:

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

if field_value:
    #self.initial[field_name] = field_value
    self.fields[field_name].initial = field_value
Run Code Online (Sandbox Code Playgroud)

  • @ndpu - 谢谢,但这也不起作用 - 字段对象存在,并且它有一个“初始”数据属性,确实设置为初始值,但它没有显示在表单上。@karthikr - 建立表单字段的代码是在 super() 调用之后执行的,直到该代码执行后我才知道初始值应该是什么。我还尝试了“self.initial.update({field_name: field_value})”,但这也会使页面上的字段留空。我还尝试将初始字段参数设置为字段定义的一部分 - 这种方法没有成功。 (2认同)
  • 出色地。我使用与答案中显示的完全相同的代码,它对我有用。 (2认同)

Meg*_*ord 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'
Run Code Online (Sandbox Code Playgroud)

my_field渲染的初始设置为'first_value'

一些选项(其中包括)可能是:

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

class MyView(View):
    # determine second_value here
    form = MyForm(initial={'my_field': 'second_value'})
Run Code Online (Sandbox Code Playgroud)

在致电之前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)
Run Code Online (Sandbox Code Playgroud)

致电之前,请确保'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'
Run Code Online (Sandbox Code Playgroud)