He creado un formulario para guardar una receta. Hace uso de un formulario y un formset en línea. Tengo usuarios con archivos de texto que contienen recetas y les gustaría cortar y pegar los datos para facilitar la entrada. He resuelto cómo rellenar la parte del formulario después de procesar la entrada de texto sin formato, pero no puedo encontrar la manera de completar el formset en línea.Datos iniciales para Django Inline Formsets
Parece que la solución casi se explica aquí: http://code.djangoproject.com/ticket/12213 pero no puedo juntar las piezas.
Mis modelos:
#models.py
from django.db import models
class Ingredient(models.Model):
title = models.CharField(max_length=100, unique=True)
class Meta:
ordering = ['title']
def __unicode__(self):
return self.title
def get_absolute_url(self):
return self.id
class Recipe(models.Model):
title = models.CharField(max_length=255)
description = models.TextField(blank=True)
directions = models.TextField()
class Meta:
ordering = ['title']
def __unicode__(self):
return self.id
def get_absolute_url(self):
return "/recipes/%s/" % self.id
class UnitOfMeasure(models.Model):
title = models.CharField(max_length=10, unique=True)
class Meta:
ordering = ['title']
def __unicode__(self):
return self.title
def get_absolute_url(self):
return self.id
class RecipeIngredient(models.Model):
quantity = models.DecimalField(max_digits=5, decimal_places=3)
unit_of_measure = models.ForeignKey(UnitOfMeasure)
ingredient = models.ForeignKey(Ingredient)
recipe = models.ForeignKey(Recipe)
def __unicode__(self):
return self.id
Se crea el formulario de receta con un ModelForm:
class AddRecipeForm(ModelForm):
class Meta:
model = Recipe
extra = 0
Y el código correspondiente en la vista (las llamadas a analizar la forma se eliminan las entradas):
def raw_text(request):
if request.method == 'POST':
...
form_data = {'title': title,
'description': description,
'directions': directions,
}
form = AddRecipeForm(form_data)
#the count variable represents the number of RecipeIngredients
FormSet = inlineformset_factory(Recipe, RecipeIngredient,
extra=count, can_delete=False)
formset = FormSet()
return render_to_response('recipes/form_recipe.html', {
'form': form,
'formset': formset,
})
else:
pass
return render_to_response('recipes/form_raw_text.html', {})
Con el FormSet() vacío como el anterior, puedo iniciar la página con éxito. He intentado algunas formas de alimentar el juego de formularios de la cantidad, unit_of_measure y los ingredientes que he identificado como:
- datos de ajuste iniciales, pero que no funciona para juegos de formularios en línea
- que pasan por un diccionario, pero que genera la gestión forman errores
- jugado un poco con init, pero estoy un poco fuera de mi no
Cualquier sugerencia muy apreciados.
Gran consejo Aram, muchas gracias. Voy a probar las opciones hoy. Me gusta especialmente tener una opción fácil ... – Sinidex
El uso de zip definitivamente funciona y puedo confirmar que también funciona guardar el formulario de la manera habitual. Todavía tengo que desarrollar la coincidencia del texto analizado con los ingredientes relevantes y el objeto de unidades de medida como usted señaló, pero creo que debería ser manejable. Gran solución – Sinidex
Sí, sí y sí. ¡Esta es una gran solución! Me costó mucho alcanzar esto. Primero estaba buscando cómo construir cada formulario en el conjunto. Luego se dio cuenta de que el trabajo inicial * does * work, en una base de formulario (no formset). En zip confiamos en ™ – Flowpoke