2010-07-31 51 views
0

这个问题是与此相关的一个验证上一个选择框,其内容通过Ajax调用

Remove all the elements in a foreign key select field

我在我的模型外键的字段,它是越来越添加失败预填充其数据,我希望选择列表为空。我确实做到了,但我提交表单时验证失败。

错误说“选择一个有效的选择,选项1是不是可用选项之一)。

这是我的模型

class RecipeIngredient(models.Model): 
    recipe = models.ForeignKey(Recipe) 
    ingredient = models.ForeignKey(Ingredient) 
    serving_size = models.ForeignKey(ServingSize) 
    quantity = models.IntegerField() 
    order = models.IntegerField() 
    created = models.DateTimeField(auto_now_add = True) 
    updated = models.DateTimeField(auto_now = True) 

class RecipeIngredientForm(forms.ModelForm): 
    serving_size = forms.ChoiceField(widget=forms.Select()) 

    class Meta: 
     serving_size = forms.ChoiceField(widget=forms.Select()) 
     model = RecipeIngredient 
     fields = ('ingredient', 'quantity', 'serving_size') 
     widgets = { 
      'ingredient': forms.TextInput(attrs={'class' : 'recipe_ingredient'}), 
      'quantity': forms.TextInput(), 
      'serving_size' : forms.Select(attrs={'class' : 'ddl'}), 
     } 

我在第三行得到一个错误

recipeIngredients = models.RecipeIngredientFormSet(request.POST) 
print(recipeIngredients.errors) 
objRecipeIngredients = recipeIngredients.save(commit=False) 

我希望选择框为空,因为它通过ajax调用填充任何想法该怎么做模型通过验证?

编辑

份量型号

class ServingSize(models.Model): 
    name = models.CharField(max_length = 255) 
    unit = models.CharField(max_length = 125) 
    food_group = models.ForeignKey(FoodGroup) 
    created = models.DateTimeField(auto_now_add = True) 
    updated = models.DateTimeField(auto_now = True) 

    objects = models.Manager() 
    dal_objects = ServingSizeManager() 

    def __unicode__(self): 
     return self.name; 

回答

1

首先,你为什么在Meta类中有serving_size?

我会在ModelForm中使用一个额外的字段,并完全忽略serve_size字段。

class RecipeIngredientForm(forms.ModelForm): 
    mycustomfield = forms.ChoiceField(widget=forms.Select()) 

    class Meta: 
     model = RecipeIngredient 
     exclude = ('serving_size', 'created', 'updated') #etc 

然后在视图中我会操纵形式向有效 ServingSize分配给serving_size领域。

[编辑]

好吧,你的实际执行情况将取决于您是通过AJAX,以及如何拉什么。但看到下面的代码: -

您的形式: -

class CustomRecipeIngredientForm(forms.ModelForm): 
    recipe = forms.ModelChoiceField(   Recipe.objects.all(), 
               widget=forms.Select(attrs={'class':'customclass',})) 

    ingredient = forms.ModelChoiceField(  Ingredient.objects.all(), 
               widget=forms.Select(attrs={'class':'recipe_ingredient',})) 

    my_custom_serving_size_field = forms.ChoiceField(widget=forms.Select(attrs={'class':'ddl',})) 

    quantity = forms.IntegerField() 

    order = forms.IntegerField() 

    class Meta: 
     model = RecipeIngredient 
     exclude = ('serving_size', 'created', 'updated',) 

通过Ajax把你的数据到my_custom_serving_size_field

您的看法: -

def my_view(request): 
    if request.method == 'POST': 
     form = CustomRecipeIngredientForm(data=request.POST) 
     if form.is_valid(): 
      new_recipe_ingredient = form.save(commit=False) 
      new_recipe_ingredient.serving_size = ServingSize.objects.get(pk=form.cleaned_data['my_custom_serving_size_field']) 
      new_recipe_ingredient.save()    

      return HttpResponseRedirect(reverse('redirect_to_wherever')) 
    else: 
     form = CustomRecipeIngredientForm() 
    return render_to_response('path/to/my_template.html', {'form': form}, context_instance=RequestContext(request)) 

当然,你的ServingSize .objects.get()逻辑将取决于你通过ajax以及如何操作。尝试按照这些方式,让我们知道。

+0

如果我这样做,那么我将如何设置serving_size字段?我正在使用inlineformset_factory。我对此有点新,谢谢。 – iJK 2010-08-03 01:42:39

+0

发布您的ServingSize型号代码,我们会尝试一下。 – chefsmart 2010-08-03 03:34:45

+0

是不是,谢谢。 – iJK 2010-08-03 04:22:28

0

看起来像你想ModelChoiceField,这

允许单一模式 对象的选择,适合代表 国外钥匙

+0

如果我使用ModelChoiceField,我将不得不提供一个查询集,我试图避免这种情况。有没有办法不提供查询集? – iJK 2010-07-31 03:28:46

+0

@iHeartDucks,不,我不相信你可以在没有查询集的情况下创建'ModelChoiceField',但是使用'ServingSize.objects.all()'有什么问题?除非你的“服食量”这个概念真的很奇怪,否则不应该有那么多的东西! - ) – 2010-07-31 03:35:33

+0

服务大小可以根据所选成分而改变。实际上,我选择了配料后填充了份量。 – iJK 2010-07-31 05:40:33