在选择框上验证失败,其内容由Ajax调用添加

时间:2010-07-31 02:54:13

标签: django django-models

这个问题与这个问题有关

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;

2 个答案:

答案 0 :(得分:1)

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

我会在ModelForm中使用一个额外的字段,并完全省去serving_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提取什么以及如何。沿着这些方向尝试一下,让我们知道。

答案 1 :(得分:0)

看起来你想要ModelChoiceField

  

允许选择单个模型   对象,适合代表一个   外键