Python 在_init__方法中设置初始Django表单字段值
Django 1.6 我在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
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'