2010-07-18 2 views
1

У меня есть набор форм, который настроен на использование таблицы соединений. В таблице присоединиться к присоединяется таблицей Рецепта и таблица Ингредиента и выглядит таким образом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)) 

Спасибо за любую помощь вы можете предоставить.

ответ

0

Считаете ли вы использование виджета, который не требует дальнейшего взлома валидации. Возможно, что-то вроде http://code.google.com/p/django-ajax-selects/? Если это не подходит точно, посмотрите файл fields.py и их пользовательские поля формы.

Смежные вопросы