1

削除する各オブジェクトの横にラジオボックスが表示されたユーザーの販売オブジェクトを表示するdjangoフォームを作成するにはどうすればよいですか?すぐに削除できるようにユーザーがラジオボックスで一覧表示されるdjangoadminに似たものを作成しようとしています。

djangoフォーム

request.userから、選択したものを削除するために、ユーザーから販売に関連付けられたオブジェクトを取得し、販売のリストを返そうとしています。これまでのところ、私のプロフィールフォームは次のようになっています。

class ProfileForm(ModelForm):
    def __init__(self, *args, **kwargs):
        self.request = kwargs.pop("request")
        super(ProfileForm, self).__init__(*args, **kwargs)

    sells = forms.IntegerField(
        widget=forms.Select(
            sell=Sell.object.filter(user=self.request.uwer)
        )
    )

views.pyで、次のように選択した販売オブジェクトを削除する予定です。

for sell in form.sells:
    sell = Sell.objects.get(id=sell)
    sell.delete()
4

1 に答える 1

1

ここにはかなりの問題があります。最も重要なのは、フォーム定義にアクセスできないため、フォーム定義で選択肢を設定できないことですrequest.user

とにかく、モデルフォームは必要ないと思います。これらはモデルインスタンスを作成および編集するためのものですが、チェックボックスを使用して既存のインスタンスを一覧表示するだけです。したがって、これらのインスタンスを表すフィールド、つまりModelMultipleChoiceFieldを持つ通常のフォームが必要です。

したがって、フォームは次のようになります。

class DeleteSellForm(forms.Form):
    sells = forms.ModelMultipleChoiceField(queryset=Sell.objects.none(),
                                           widget=forms.CheckboxSelectMultiple)

    def __init__(self, *args, **kwargs):
        user = kwargs.pop('user', None)
        super(DeleteSellForm, self).__init__(*args, **kwargs)
        self.fields['sells'].queryset=Sell.objects.filter(user=user)

クエリセットのデフォルトはnoneですが、__init__メソッド内の正しいユーザーのオブジェクトに設定されており、ユーザーを渡すことができます。

したがって、ビューは次のようになります。

def delete_sells(request):
    if request.POST:
        form = DeleteSellsForm(request.POST, user=request.user)
        if form.is_valid():
            form.cleaned_data['sells'].delete()
    else:
        form = DeleteSellsForm(user=request.user)
    return render(request, 'template.html', {'form': form})

ModelMultipleChoiceFielddelete()QuerySetをクリーンアップするので、直接呼び出すことができるはずです。

于 2013-03-25T08:12:34.733 に答える