2010-07-18 70 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)) 

感謝您的幫助,您可以提供。

回答