python - personalizados - post django
django: quiere tener un formulario para datos de secuencia cambiados dinámicamente (1)
Expertos de Django: soy un novato y necesito su ayuda con lo siguiente.
Supongamos que tengo una estructura de datos complicada, un ejemplo arbitrario:
(formato yaml)
foo:
{
ff: [ bar, foobar]
bb: {''some map values''}
}
bar: [str!! "", str!! ""]
foobar: [str!! "", str!! ""]
...
Mi objetivo es una interfaz web que permita crear / modificar / guardar y visualizar dichos datos. No puedo imaginarme cómo definir una forma y un modelo para ese tipo de datos. El problema es que los datos no son estáticos, por ejemplo, el usuario puede agregar tantos elementos de la lista como desee para el valor ''ff'', es decir, no se fijan dos elementos ''bar'' y ''foobar'', puede haber un número ilimitado de artículos agregados. (Lo mismo para el resto de los datos secuenciados). Solo sé que el valor de ''ff'' es un valor de lista. (Imagino la vista web con un pequeño signo "+" que permite agregar datos).
Tan pronto como se rellene el formulario, quiero poder usar pyyaml para convertirlo a yaml y guardar los datos. Y a la inversa: cargue los datos de un archivo y visualícelos en el formulario para permitir modificaciones.
Entonces, en dos palabras: cómo lidiar con "campos de formulario / modelo dinámicos y secuenciados".
PD: Otro problema que tengo aquí es no tener campos de tipos incorporados. Pienso en tener un formulario separado para cada tipo de campo y "referencia" con Foreign Key. ¿Es ese un buen camino a seguir? ¿O puede ir con la definición de campos personalizados es mejor?
¡¡Muchas gracias de antemano!!
Si no desea crear Modelos concretos para sus listas, puede usar django-picklefield :
from picklefield.fields import PickledObjectField
class MyModel(models.Model):
my_list = PickledObjectField(default=[])
Entonces úsalo así:
m1 = MyModel()
m1.my_list = [1, 2, 3]
m1.save()
m2 = MyModel()
m2.my_list = ["a", "b", "c", "d"]
m2.save()
ACTUALIZAR
En los formularios, debe crear campos personalizados según el tipo de datos que necesita. Lo más simple es usar un campo de texto y convertir el texto separado por comas en una lista:
class MyModelForm(forms.ModelForm):
class Meta:
model = MyModel
def __init__(self, *args, **kwargs):
super(MyModel, self).__init__(*args, **kwargs)
self.fields["my_list"] = forms.CharField(initial=",".join(self.instance.my_list))
def clean_my_list(self):
data = self.cleaned_data.get(''my_list'', '''')
if data:
return data.split(",") # Add error check, convert to number, etc
return []