17

したがって、私の目標は、ModelForm の ModelChoiceField クエリセットをフィルタリングして、request.user が作成した場所のみを含めることです。

私のModelFormは単純です:

class PlaceEventForm(models.ModelForm):
    class Meta:
        model = Event

次のようなものを追加できるようにしたいと思います。

def __init__(self, *args, **kwargs):
    super(PlaceEventForm, self).__init__(*args, **kwargs)
    self.fields['place'].queryset = Place.objects.filter(created_by=request.user)

ただし、ModelForm でリクエストにアクセスする方法が見つからないようです。

私の見解は次のようなものです:

class PlaceEventFormView(CreateView):
    form_class = PlaceEventForm
    template_name = 'events/event_create.html'

    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super(PlaceEventFormView, self).dispatch(*args, **kwargs)

これが私がすべきことに近いかどうかはわかりませんが、試しました:

def get_form_kwargs(self):
    kwargs = super(PlaceEventFormView, self).get_form_kwargs()
    kwargs.update({'place_user': self.request.user})
    return kwargs

しかし、エラーが発生しました: init () が予期しないキーワード引数 'place_user'を取得しました

これに関するアイデアはありますか?または、リクエストを ModelForm に渡す必要なく、ビューで ModelChoiceField をフィルタリングする方法を考えられる人はいますか?

4

3 に答える 3

27

メソッドに移動しないようにするには、メソッド内userからキーをポップする必要があります。kwargsPlaceEventForm.__init__()ModelForm.__init__()

views.py:

class PlaceEventFormView(CreateView):
    form_class = PlaceEventForm
    template_name = 'events/event_create.html'

    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super(PlaceEventFormView, self).dispatch(*args, **kwargs)

    def get_form_kwargs(self):
        kwargs = super(PlaceEventFormView, self).get_form_kwargs()
        kwargs.update({'place_user': self.request.user})
        return kwargs

forms.py:

class PlaceEventForm(models.ModelForm):
    class Meta:
        model = Event

    def __init__(self, *args, **kwargs):
        user = kwargs.pop('place_user')
        # now kwargs doesn't contain 'place_user', so we can safely pass it to the base class method
        super(PlaceEventForm, self).__init__(*args, **kwargs)
        self.fields['place'].queryset = Place.objects.filter(created_by=user)
于 2011-04-27T16:31:26.717 に答える
2

私はiPhoneを使用していますが、これを行います:

def get_form(self, form_class):
     form = super(MyView, self).get_form(form_class)
     form.fields['place'].querset = Place....
     return form

うわー大変だった!インデント対応無し!

于 2011-04-27T17:26:05.157 に答える