2010-07-18 6 views
1

J'ai un formset qui est configuré pour utiliser une table de jointure. La table de jointure se joint à une table de recettes et une table des ingrédients et ressemble ainsidjango Personnalisé ManyToMany enregistrer sur le modèle Options de Formulaire

class RecipeIngredient(models.Model): 
    '''intermediate model between Ingredient and recipe.models.recipe 
for many to many''' 
    quantity = models.IntegerField() 
    measurement = models.CharField(max_length=200) 
    ingredient = models.ForeignKey(Ingredient) 
    preparation = models.CharField(max_length=100, blank=True, 
null=True) 
    recipe = models.ForeignKey(Recipe) 

J'ai créé le formset comme si

IngFormSet = inlineformset_factory(Recipe, RecipeIngredient, 
formset=BaseIngFormSet, extra=5) 

Le BaseIngFormSet a été créé pour transformer la valeur par défaut du menu déroulant pour la champ d'ingrédient (plusieurs à plusieurs avec la table Ingredient), dans une boîte de saisie afin que je puisse ensuite utiliser jquery-autocomplete sur la boîte de saisie . Cela permettrait aux utilisateurs de faire défiler une très longue liste d'ingrédients à sélectionner.

class BaseIngFormSet(BaseModelFormSet): 
    def add_fields(self, form, index): 
     super(BaseIngFormSet, self).add_fields(form,index) 
     form.fields["ingredient"] = forms.CharField() 

Cette partie que je suis actuellement coincé sur, lorsque le formulaire est soumis il échoue parce que l'ingrédient n'est plus en instance de la table ingrédient

ne peut pas affecter « u'Ground Turkey '": " RecipeIngredient.ingredient "doit être une instance" Ingrédient ".

Je pensais que je dois prendre ce qui est tapé dans la zone d'entrée, puis faire une recherche sur contre quelque chose de modèle Ingredient comme Ingredient.objects.get (title = « bla »)

Ensuite, définissez d'une manière ou d'une autre cet objet sur RecipeIngredient.ingredient dans le formset , avant que le formset ne soit validé. Malheureusement, je ne sais pas où ou comment faire cela. J'ai essayé d'entrer dans le shell et de mettre en place le formset puis de faire un dir (formset) dessus pour voir si cela donnerait quelque lumière que ce soit sur mon problème mais je n'ai rien trouvé. Est-ce que quelqu'un a des suggestions sur la façon de prendre ce qui est passé dans l'ingrédient entrée pour le formset, et le transformer en un objet de la table Ingrédient? Je sais à un moment donné un utilisateur peut saisir un ingrédient qui n'est pas dans la base de données, et je prévois de faire une recherche sur ce qui est passé, et si il ne figure pas dans la base de données, je le créerais puis passez ce nouvel objet au jeu de formulaires . Voici ce que j'ai actuellement à mon avis pour cette forme

from django.shortcuts import render_to_response, get_object_or_404, 
get_list_or_404, redirect 
from django.template import RequestContext 
from django.contrib.auth.decorators import login_required 
from django.forms.models import modelformset_factory, 
inlineformset_factory 
from models import Recipe, RecipeIngredient 
from ingredient.models import Ingredient 
from forms import RecipeForm, BaseIngFormSet 
@login_required 
def recipe(request): 
    IngFormSet = inlineformset_factory(Recipe, RecipeIngredient, 
formset=BaseIngFormSet, extra=5) 
    if request.method=='POST': 
     form = RecipeForm(request.POST, request.FILES) 
     formset = IngFormSet(request.POST) 
     if form.is_valid() and formset: 
      new_recipe = form.save() 
      instances = formset.save(commit=False) 
      for instance in instances: 
       instance.recipe_id = new_recipe.id 
       instance.save() 
      return redirect(new_recipe.get_absolute_url()) 
    else: 
     form = RecipeForm() 
     formset = IngFormSet(queryset=RecipeIngredient.objects.none()) 
    return render_to_response('recipe/recipe_form.html', {'form': 
form, 'formset' : formset,}, context_instance=RequestContext(request)) 

Merci pour toute aide que vous pouvez fournir.

Répondre

0

Avez-vous envisagé d'utiliser un widget qui ne nécessite pas de validation ultérieure? Peut-être quelque chose comme http://code.google.com/p/django-ajax-selects/? Si cela ne correspond pas exactement, jetez un oeil au fichier fields.py et leurs champs de formulaire personnalisé.

Questions connexes