método meaning español __init__ python django django-1.6

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)