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.