У меня есть набор форм, который настроен на использование таблицы соединений. В таблице присоединиться к присоединяется таблицей Рецепта и таблица Ингредиента и выглядит таким образомdjango Custom ManyToMany сохранить на модели Параметры формы
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)
Я создал formset как так
IngFormSet = inlineformset_factory(Recipe, RecipeIngredient,
formset=BaseIngFormSet, extra=5)
BaseIngFormSet был создан, чтобы превратить выпадающее меню по умолчанию для в (многие ко многим с таблицей Ингредиентов), в поле ввода , чтобы затем я мог использовать jquery-autocomplete в поле ввода . Это позволит сэкономить некоторое время у пользователей, имеющих возможность прокручивать очень длинный список ингредиентов для выбора.
class BaseIngFormSet(BaseModelFormSet):
def add_fields(self, form, index):
super(BaseIngFormSet, self).add_fields(form,index)
form.fields["ingredient"] = forms.CharField()
Та часть, что я в настоящее время застрял на есть, когда форма была отправлена не откажет, потому что компонент больше не находится в экземпляре ингредиента таблицы
Не может назначить «u'Ground Турция '': «RecipeIngredient.ingredient» должен быть экземпляром «Ингредиент».
Я полагал, что нужно взять то, что набирается в поле ввода, затем сделать поиск по нему против Ингредиент модели что-то вроде Ingredient.objects.get (название = «бла»)
Затем каким-то образом установите этот объект в RecipeIngredient.ingredient в наборе форм , прежде чем шаблон будет проверен. К сожалению, хотя я не знаю , где и как это сделать. Я попытался зайти в оболочку и установить форму, а затем сделать на нем dir (formet), чтобы увидеть, может ли это пролить любой свет на мою проблему, но я ничего не придумал. Кто-нибудь есть какие-либо предложения о том, как принять то, что передается в ингредиент ввод для набора форм, и превратить это в объект из таблицы ? Я знаю, что в какой-то момент пользователь может ввести ингредиент, который не находится в базе данных, и я планирую выполнить поиск того, что передано, и если не найдено в базе данных, я бы его создал, а затем передать новый объект для набора форм. Вот что я в настоящее время, на мой взгляд для этой формы
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))
Спасибо за любую помощь вы можете предоставить.