Red de conocimiento informático - Espacio del host - Cómo uso Django para definir formularios dinámicamente

Cómo uso Django para definir formularios dinámicamente

El asistente de formularios en Django es fácil de usar.

[python]?ver copia simple

desde?django.utils.translation?import?ugettext_lazy?as?_?

desde?django?import?forms ?

de?django.forms.formets?import?BaseFormSet?

de?django.forms.fields?import?

de?django.forms. util?import?ValidationError?

desde?django.shortcuts?import?render_too_response?

desde?django.contrib.formtools.wizard?

desde?ddtcms .office.ipment.models?import?Equipo,Característica,ValorCaracterístico?

clase?EquipmentForm(forms.ModelForm):?

clase?Meta:?

modelo?=?Equipo?

clase?CharacteristicValueForm(forms.Form):?

def?clean(self):?

a=self. campos?

s=self.data?

self.cleaned_data?=?{}?

#?Los siguientes párrafos están copiados de django form.py full_clean

for?name,?fields?in?self.fields.items():?

#"value_from_datadict() "puede obtener datos del diccionario de datos.

#"Cada tipo de widget sabe cómo obtener sus propios datos, porque algunos

#"value_from_datadict() "pueden obtener datos de un diccionario de datos.

#?widgets.value?=?field.widget.value_from_datadict(self.data, self.files, self.add_prefix(nombre))?

prueba:?

if?isinstance(campo,?FileField):?

inicial =?self.initial.get(nombre,?campo.initial)?

valor?=? field.clean(valor,?inicial)?

otro:?

valor?=?field.clean(valor)?

self.cleaned_data[nombre ]? =?valor?

if?hasattr(self,?' clean_%s'? %?name):?

valor?=?getattr(self,?' clean_ %s'? %?nombre)()?

self.cleaned_data[nombre] =?valor?

self._errors[nombre]? =?self.error_class(e. mensajes)?

if?

del?self.cleaned_data[nombre]?

#cl=self.cleaned_data

#debug ()<<

return?self. clean_data? clean_data?

clase?EquipmentCreateWizard(FormWizard):?

def?done(self,?request,?form_list):?

return?render_to_response ('equipment/done.html', ?

{?

'form_data':?[form.cleaned_data en form_list],?

})?

def ?get_form(self,?step,?data=None):?

¿"Método auxiliar que devuelve una instancia de formulario para un paso determinado"?

¿formulario?=?self.form_list[paso](datos,?prefix=self.prefix_for_step(paso),?initial=self.initial.get(paso,?Ninguno))?

si?

if.data:?

cg=?data.get('0-categoría',?1)?

cs= ?Characteristic.objects.all().filter(category__id=cg)?

¿para?

form.fields['Characteristic-'+str(c.id)] =? ?forms.CharField(label?=?c.name)?

g=form.fields

#debug()

return?Copiado del asistente. py para realizar modificaciones.

def?render(self,?form,?request,?step,?context=None):?

"Renderiza el objeto de formulario dado y devuelve HttpResponse."?< / p>

old_data?=?request.POST?

prev_fields?=?[]?

if?

hidden =?forms.HiddenInput ( )?

#Recopila todos los datos de los pasos anteriores y preséntalos como campos ocultos HTML.

para?i?in?range(paso):?

old_form = self.get_form(i, old_data)?

hash_name?=?hash_% s'?

prev_fields.extend([bf.as_hidden()?for?bf?in?old_form])?

prev_fields.append(hidden.render(hash_name,?old_data .get(hash_name,?self.security_hash(solicitud,?old_form))))?))?

if?

cg=?old_data.get('categoría 0' ,?1)?

cs=?Characteristic.objects.all().filter(category__id=cg)?

para?

form.fields[ 'Característica-'+str(c.id)]? =?forms.CharField(label?=?c.name)?

g=form.fields

#debug? ()

si?

depurar()?

return.super(EquipmentCreateWizard,?self).render(formulario,?solicitud,?paso,? ¿context=Ninguno)?

def?get_template(self,?step):?

return?'ipment/wizard_%s.html'?

[python]?ver plano?copiar

desde?django.utils.translation?import?ugettext_lazy?

desde?django?import?forms?

desde?django.forms.formets?import?BaseFormSet?

desde?django.forms.fields?import?

desde?django.forms.util? ¿importar?ValidationError?

desde?django.shortcuts?import?render_too_response?

desde?django.contrib.formtools.wizard?

desde?ddtcms.office .ipment.models?import?Equipo,Característica,ValorCaracterístico?

clase?EquipmentForm(forms.ModelForm):?

clase?Meta:?

modelo ?=?Equipo?

clase?CharacteristicValueForm(forms.Form):?

def?clean(self):?

a=self.fields?

s=self.data?

self.cleaned_data?=?{}?

#?El siguiente for se copia de full_clean en django form.py .

for?

#"value_from_datadict()" Obtener datos del diccionario de datos.

#?Cada tipo de widget sabe cómo obtener sus propios datos, ya que algunos widgets distribuyen datos a múltiples campos HTML.

valor = campo.widget.value_from_datadict(self.data, self.files, self.add_prefix(nombre))?

prueba:?

si? isinstance(campo,?FileField):?

inicial =?self.initial.get(nombre,?field.initial)?

valor?=?field.clean(valor, ?inicial)?

otro:?

valor?=?field.clean(valor)?

self.cleaned_data[nombre] =?valor?

if?hasattr(self,?' clean_%s'? %?name):?

valor?=?getattr(self,?' clean_%s'? %? nombre)()?

self.cleaned_data[nombre] =?valor?

self._errors[nombre]? =?self.error_class(e.messages)?

¿si?

del?self.cleaned_data[nombre]?

#cl=self.cleaned_data?

#debug()<<<

return?self.cleaned_data?

clase?EquipmentCreateWizard(FormWizard):?

def?done(self,?request,?form_list):?

return?render_to_response('ipment/done.html',?

{?

'form_data':?[form.cleaned_data en form_list],?

})?

def?get_form(self,?step,?data=None):?

"Auxiliar que devuelve la instancia del formulario para el paso dado método"?

¿formulario?=?self.form_list[paso](datos,?prefix=self.prefix_for_step(paso),?initial=self.initial.get(paso,?Ninguno))?

si?

if.data:?

cg=?data.get('0-categoría',?1)?

cs= ?Characteristic.objects.all().filter(category__id=cg)?

¿para?

form.fields['Characteristic-'+str(c.id)] =? ?forms.CharField(label?=?c.name)?

g=form.fields?

retorno?

def?

def?render(self,?form,?request,?step,?context=None):?

"Renderiza el objeto de formulario dado y devuelve HttpResponse."?

old_data?=?request.POST?

prev_fields?=?[]?

if?

hidden =?forms.HiddenInput()?

#Recopila todos los datos de los pasos anteriores y preséntalos como campos ocultos HTML.

para?i?in?range(pasos):?

old_form = self.get_form(i, old_data)?

hash_name?=?hash_% s'?

prev_fields.extend([bf.as_hidden()?for?bf?in?old_form])?

prev_fields.append(hidden.render(hash_name,?old_data .get(hash_name,?self.security_hash(solicitud,?old_form))))?))?

if?

cg=?old_data.get('categoría 0' ,?1)?

cs=?Characteristic.objects.all().filter(category__id=cg)?

para?

form.fields[ 'Característica-'+str(c.id)]? =?forms.CharField(label?=?c.name)?

g=form.fields?

si?

#debug()?

return.super(EquipmentCreateWizard,?self).render(formulario,?request,?step,?context=None)?

def?get_template(self,?step):?

return?'ipment/wizard_%s.html'? %?step?

EquipmentCreateWizard en realidad se puede colocar en views.py, creo que esto es más razonable.

En EquipmentCreateWizard, intenté modificar la función Process_step, pero no pude obtener el resultado correcto, luego modifiqué get_form, pero quería copiarlo desde formtools Wizard.py de Django y modificarlo.

Las modificaciones a get_form tampoco dieron resultados correctos. Luego modifiqué la función de renderizado y mostré la cantidad de parámetros dinámicos en el paso 2.

Pero al final del último enlace, en los datos del formulario obtenidos, el segundo formulario no tenía datos y era un {} vacío.

Así que volví a modificar la función get_form solo para determinar si debía ingresar el segundo. step. y luego agregó dinámicamente varios campos al segundo formulario:

[python]?view Plaincopy

if?step?==?1:?

cg=?old_data.get('categoría 0',?1)?

cs=?Characteristic.objects.all().filter(categoría__id=cg)?

para?

form.fields['Characteristic-'+str(c.id)]? =?forms.CharField(label?=?c.name)?

g= form.fields?

[python]?view Plain?

cg=?old_data.get('0-category',?1)?

cs =?Characteristic.objects.all().filter(category__id=cg)?

¿para?

form.fields['Characteristic-'+str(c.id)]? =?forms.CharField(label?=?c.name)?

g=form.fields?

Este código aparece tanto en get_form como en render. Su función es Determinar si. es el paso 2, luego consulta una categoría específica según la categoría de dispositivo seleccionada en el paso 1, obtiene los parámetros del dispositivo de la categoría según la categoría y luego cambia la cantidad de parámetros en el campo de parámetros del formulario según la cantidad de parámetros.

'Characteristic-'+str(c.id) se usa para guardar datos más tarde, dividir la cadena, obtener el ID del parámetro y guardar la Característica-1 y la Característica-2 en la tabla de valores del parámetro. ..

'Characteristic-'+str(c.id) se usa para guardar datos más tarde, dividir la cadena, obtener el ID del parámetro y guardar Característica-1, Característica- en el parámetro. tabla de valores 2....

g=form.fields

#debug()

Se utiliza como punto de interrupción para ver cuántos campos de parámetros hay y si el cambio fue exitoso.