django Custom ManyToMany保存模型Formset选项

时间:2010-07-18 19:37:55

标签: django django-forms

我有一个设置为使用连接表的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) 

我像这样创建了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 Turkey”:   必须是“RecipeIngredient.ingredient”   一个“成分”的例子。

我想我需要输入输入框中输入的内容,然后执行操作 搜索成分模型的东西就像 Ingredient.objects.get(title =“blah”)

然后以某种方式将该对象设置为中的RecipeIngredient.ingredient formset,在验证formset之前。可悲的是,虽然我不知道 在哪里或如何做到这一点。我试着进入shell并设置 然后在formset上做一个dir(formset),看看是否会脱落 在我的问题上有任何亮点,但我没有想出任何东西。有没有人 有关如何采取成分中传递的任何建议 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)) 

感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:0)

您是否考虑过使用不需要任何后续验证黑客攻击的小部件。也许像http://code.google.com/p/django-ajax-selects/这样的东西?如果这不完全适合,请查看fields.py文件及其自定义表单字段。