J'ai créé un formulaire pour enregistrer une recette. Il utilise une forme et un formset en ligne. J'ai des utilisateurs avec des fichiers texte contenant des recettes et ils aimeraient couper et coller les données pour faciliter l'entrée. J'ai calculé comment peupler la partie de formulaire après avoir traité l'entrée de texte brut mais je n'arrive pas à comprendre comment peupler le formset en ligne.Données initiales pour les ensembles de formulaires en ligne Django
Il me semble que la solution est presque épelée ici: http://code.djangoproject.com/ticket/12213 mais je ne peux pas tout à fait mettre les pièces ensemble.
Mes modèles:
#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
La forme de recette est créée en utilisant un ModelForm:
class AddRecipeForm(ModelForm):
class Meta:
model = Recipe
extra = 0
Et le code correspondant dans la vue (appels pour analyser les entrées utilisées sous forme sont supprimés):
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', {})
Avec le formulaire vide() vide comme ci-dessus, je peux lancer la page avec succès. J'ai essayé quelques façons de nourrir la formset la quantité, unit_of_measure et ingrédients que j'ai identifiés, notamment:
- définition des données initiales, mais cela ne fonctionne pas pour formsets inline
- passant un dictionnaire, mais qui génère la gestion forme des erreurs
- joué avec mais je initialisation suis un peu hors de ma profondeur il
Toutes les suggestions très appréciées.
Bon conseil Aram, merci beaucoup. Je vais essayer les options aujourd'hui. J'aime particulièrement avoir une option facile ... – Sinidex
Utiliser zip fonctionne vraiment et je peux confirmer que la sauvegarde du formulaire fonctionne aussi bien. J'ai encore besoin de construire en faisant correspondre le texte analysé avec les ingrédients et les unités de mesure pertinents, comme vous l'avez souligné, mais je pense que cela devrait être gérable. Excellente solution – Sinidex
Oui oui et oui. C'est une excellente solution! J'ai eu du mal à y parvenir. Je cherchais d'abord à construire chaque forme de l'ensemble. Puis réalisé initial * does * travail, sur une base de formulaire (pas formset). Dans zip nous faisons confiance ™ – Flowpoke