Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在_init__方法中设置初始Django表单字段值_Python_Django_Django 1.6 - Fatal编程技术网

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

Python 在_init__方法中设置初始Django表单字段值,python,django,django-1.6,Python,Django,Django 1.6,Django 1.6 我在Django表单类中有一个工作代码块,如下所示。我从中构建表单字段列表的数据集可以包含任何字段的初始值,但在表单中设置该初始值时没有成功。下面的if field\u value:块确实填充了初始表单字典属性,但未显示初始值。请注意(如果您想知道的话),.initial属性在调用super()之后才存在 这能做到吗 如果是这样的话,我有什么做得不对 谢谢 def __init__(self, *args, **kwargs): id = kwargs.pop('v

Django 1.6

我在Django表单类中有一个工作代码块,如下所示。我从中构建表单字段列表的数据集可以包含任何字段的初始值,但在表单中设置该初始值时没有成功。下面的
if field\u 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
试着这样做:

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

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

我遇到了完全相同的问题,我这样解决了它:

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

我遇到了一个类似的问题,为一个名为“needs_response”的单选按钮设置初始值,并通过检查self的属性和引用“声明的_字段”解决了这个问题:

    # 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)
这项工作:

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',
    )

我想指出的是,尽管这可能无法解决您的问题,但发送到表单的“初始”dict kwarg似乎比
字段['field\u 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\u字段
呈现的初始值将设置为
“第一个值”

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

在初始化表单之前,在视图中确定
second\u值

class MyView(View):
    # determine second_value here
    form = MyForm(initial={'my_field': 'second_value'})
在调用
super()
之前,将
初始值中的
第一个值
替换为
第二个值

在调用
super()
之前,确保
'first\u value'
不在
kwargs['initial']
中:


在字段定义中设置
initial=“
”将解决您的问题。两种建议的方法都是正确的,您只需在字段定义中定义
initial=“
,问题就解决了

@ndpu-谢谢,但这也不起作用-字段对象存在,它的数据属性“initial”确实设置为初始值,但它没有显示在表单上@karthikr—建立表单字段的代码在super()调用之后执行,直到执行了该代码,我才知道初始值应该是什么。我还尝试了“self.initial.update({field\u name:field\u value})”,但这也使页面上的字段保持空白。我还尝试将初始字段参数设置为字段定义的一部分-这种方法没有成功。我使用与答案中显示的代码完全相同的代码,它对我有效。@karthikr-我猜您的代码有效,因为您在设置属性后调用了super()。周五玩这个游戏时,事情变得更有趣了——我不仅可以验证初始值是否存在,它也是一个必填字段,而且值的存在会导致表单在视图的post()方法中传递is_valid()!所以,我得到了最坏的结果-值在那里并且经过验证,但不会显示在表单上!!我还没有按我所需要的方式来工作,但我有几个发现,失败可能不在于我如何填充初始值,而在于字段类型的行为(或我对该行为的理解)。我将发布一个新的主题,讨论这个问题的这一方面。感谢您的所有输入。您必须先使用
super
初始化表单,才能使
self.fields
有效。我的问题是我正在调用super。\u init在设置self.init之后。。。嘘!
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)
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'