2

ユーザーが特定のモデルに関連付けられている外部キーのリストを削除できるようにしたい。

次の2つのモデルがあるとします。


class IceBox(models.Model):
    ...

class FoodItem(models.Model):
    name = models.CharField(...)
    icebox = models.ForeignKey(IceBox)

    def __unicode__(self):
        return self.name

削除する複数の食品を選択するために使用されるフォーム:


class IceBoxEditForm(forms.Form):
        fooditems = forms.ModelChoiceField(queryset=FoodItem.objects.none(), widget=forms.CheckboxSelectMultiple(), empty_label=None)

対応するビュー:


def icebox_edit(request, item=None):
        # Grab the particular icebox
        icebox = get_object_or_404(IceBox, pk=item)

        if request.method == "POST":
                form = IceBoxEditForm(request.POST)
                print request.POST
                if form.is_valid():
                        # Delete should happen
        else:
                form = IceBoxEditForm()
                # Only use the list of fooditems that this icebox holds
                form.fields['fooditems'].queryset = icebox.fooditem_set.all()

        return render_to_response('icebox_edit.html', {'form':form},context_instance=RequestContext(request))    

フォームには、そのアイスボックスに関連付けられている食品のチェックボックスが正しくリストされています。ただし、何かを選択してフォームを送信すると、フォームエラーが発生します。

Select a valid choice. That choice is not one of the available choices.

Djangoが期待している、私が見逃している他のカスタム検証はありますか?

編集:私はこれを試しましたが、構文エラーが発生します:


form:
class IceBoxEditForm(forms.Form):
        fooditems = forms.ModelChoiceField(queryset=FoodItem.objects.none(), widget=forms.CheckboxSelectMultiple(), empty_label=None)


        def __init__(self, *args, **kwargs):
              queryset = kwargs.pop('queryset', None)
              super(IceBoxEditForm, self).__init__(*args, **kwargs)

              if queryset:
                        self.fields['fooditems'].queryset = queryset

view:
        form = IceBoxEditForm(queryset=icebox.fooditem_set.all(), request.POST) # Syntax error!

        ....
    else:
        form = IceBoxEditForm(queryset=icebox.fooditem_set.all())
        ....
4

1 に答える 1

3

You've changed the queryset for the field for a GET request, but not for a POST. So when you submit the form, Django is still using the original queryset, so your selection is not valid.

Either change it at the beginning of the view, so it happens for both POST and GET, or even better do it in the form's __init__ method.

于 2012-05-28T18:38:44.790 に答える