【问题标题】:django Custom ManyToMany save on model Formset Optionsdjango Custom ManyToMany 保存模型 Formset Options
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-16
      • 1970-01-01
      • 1970-01-01
      • 2019-04-15
      • 2016-11-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-12
      相关资源
      最近更新 更多