2010-07-18 53 views
1

我有一个formset被设置为使用连接表。连接表 加入了一个配方表和配​​料表,看起来像这样django自定义ManyToMany保存模型Formset选项

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) 

我创建像这样

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

的BaseIngFormSet创建打开默认的下拉菜单 的该formset成分字段(许多与成分表),到一个 输入框,以便我可以稍后在 输入框中使用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,然后验证formset。可悲的是,虽然我不知道 在哪里或如何做到这一点。我尝试着进入shell并设置 formset,然后对它做一个dir(formset)以查看是否会在我的问题上遇到任何问题,但我没有提出任何问题。有没有人 有任何建议如何采取通过配料 输入的formset,并从 成分表变成一个对象? 我知道在某些时候用户可能会输入一个不在 数据库中的成分,我打算对传递的内容进行查找,如果在数据库中找不到 ,我会创建它,然后将该新对象传递给该表单组。 这是我目前在我看来,这种形式

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)) 

感谢您的帮助,您可以提供。

回答