Django 1.6
J'ai un bloc de code de travail dans une classe de formulaire Django comme indiqué ci-dessous. L'ensemble de données à partir duquel je construis la liste de champs de formulaire peut inclure une valeur initiale pour n'importe lequel des champs, et Je ne parviens pas à définir cette valeur initiale dans le formulaire. Le bloc if field_value:
Ci-dessous remplit effectivement l'attribut de dictionnaire de formulaire initial, mais la valeur initiale ne s'affiche pas. Notez que (au cas où vous vous poseriez la question ) l'attribut .initial
n'existe qu'après l'appel de super()
.
Cela peut-il être fait?
Si oui, qu'est-ce que je ne fais pas correctement pour que cela fonctionne?
Merci!
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
J'ai eu exactement le même problème et je l'ai résolu en faisant ceci:
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
Essayez de cette façon:
super(ViagemForm, self).__init__(*args, **kwargs)
if field_value:
#self.initial[field_name] = field_value
self.fields[field_name].initial = field_value
Je tiens à mentionner, bien que cela ne puisse pas résoudre votre problème, qu'un dict kwarg "initial" envoyé à un formulaire semble avoir la préférence sur 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
Rendu sera initialisé à 'first_value'
.
Certaines options (entre autres) peuvent être:
Déterminez second_value
Dans la vue avant d'initialiser le formulaire:
class MyView(View):
# determine second_value here
form = MyForm(initial={'my_field': 'second_value'})
remplacez first_value
par second_value
dans initial
avant d'appeler 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)
Assurez-vous que 'first_value'
N'est pas dans kwargs['initial']
Avant d'appeler 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'
Cela marche:
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',
)
J'ai eu un problème similaire en définissant la valeur initiale d'un bouton radio appelé 'needs_response' et je l'ai résolu en inspectant les attributs de soi et en référençant 'déclarés_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)