【发布时间】:2010-07-18 19:37:54
【问题描述】:
我有一个设置为使用连接表的表单集。连接表 连接一个食谱表和一个成分表,看起来像这样
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 是为了打开默认下拉菜单 成分字段(多对多与成分表),进入 输入框,以便我以后可以在 输入框。这将节省一些用户不得不滚动的时间 很长的成分列表可供选择。
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”必须是 一个“成分”实例。
我想我需要输入输入框中的内容,然后执行 根据成分模型搜索它,例如 成分.objects.get(title="blah")
然后以某种方式将该对象设置为 RecipeIngredient.ingredient formset,在表单集被验证之前。可悲的是虽然我不知道 在哪里或如何做到这一点。我尝试进入外壳并设置 formset 然后在其上执行 dir(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))
感谢您提供的任何帮助。
【问题讨论】:
标签: django django-forms