我有一个设置为使用连接表的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))
感谢您提供的任何帮助。
答案 0 :(得分:0)
您是否考虑过使用不需要任何后续验证黑客攻击的小部件。也许像http://code.google.com/p/django-ajax-selects/这样的东西?如果这不完全适合,请查看fields.py
文件及其自定义表单字段。