meaning - __init__.py python
Establecer el valor inicial del campo de formulario de Django en el método__init__ (5)
Esto funciona:
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'',
)
Django 1.6
Tengo un bloque de código funcional en una clase de formulario de Django, como se muestra a continuación. El conjunto de datos a partir del cual estoy creando la lista de campos de formulario puede incluir un valor inicial para cualquiera de los campos, y no estoy teniendo éxito al establecer ese valor inicial en el formulario. El valor if field_value:
block a continuación llena el atributo de diccionario de formulario inicial, pero el valor inicial no se muestra. Tenga en cuenta que (en caso de que se lo pregunte) el atributo .initial
no existe hasta después de la llamada super()
.
Se puede hacer esto?
Si es así, ¿qué no estoy haciendo bien para que esto funcione?
¡Gracias!
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
Intente de esta manera:
super(ViagemForm, self).__init__(*args, **kwargs)
if field_value:
#self.initial[field_name] = field_value
self.fields[field_name].initial = field_value
Quiero mencionar, aunque esto podría no resolver su problema, que un dict kwarg ''inicial'' enviado a un formulario parece tener preferencia sobre el 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
tendrá el conjunto inicial en ''first_value''
.
Algunas opciones (entre otras) pueden ser:
Determine second_value
en la vista antes de inicializar el formulario:
class MyView(View):
# determine second_value here
form = MyForm(initial={''my_field'': ''second_value''})
reemplace first_value
con second_value
en initial
antes de llamar a 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)
Asegúrate de que ''first_value''
no esté en kwargs[''initial'']
antes de llamar a 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''
Tenía exactamente el mismo problema y lo resolví haciendo esto:
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
Tuve un problema similar al establecer el valor inicial de un botón de radio llamado ''needs_response'' y lo resolví inspeccionando los atributos de mí mismo y haciendo referencia a ''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)