0

私はDjangoの初心者なので、これがばかげた質問である場合はご容赦ください。複数のフィールドがある検索フォームがあります。空ではない送信されたフィールドでクエリセットをフィルタリングしたいだけです。それ、どうやったら出来るの?クエリセットとQオブジェクトをチェーン化できることは承知していますが、チェーンから空のキーと値のペアを削除する方法がわかりません。以下がうまくいかないことは知っていますが、それは私が探しているものへの洞察を提供するかもしれないと思いました。ありがとうございました。

def art_search(request):
    if request.method == 'GET':
        form = AdvSearch(request.GET)
        if form.is_valid():
            art_name = form.cleaned_data['art_name']
            art_number = form.cleaned_data['art_number']
            artwork = Inventory.objects.filter(
                if art_name is not u'':
                    Q(marketingname=art_name),
                if art_number is not u'':
                    Q(marketingnumber=art_number)
            )
            return object_list(request, queryset=artwork)
    else:
        form = AdvSearch()
    return render_to_response('art/search.html', {
        'form': form,
    })
4

4 に答える 4

2

あなたは書くことができます:

if form.is_valid():
    opts = {}
    for key in form.cleaned_data:
        if form.cleaned_data[key] != '':
            opts[key] = form.cleaned_data[key]
    artwork = Inventory.objects.filter(**opts)
    return object_list(request, queryset=artwork)

フィルタ パラメータがフォーム フィールドと同じ名前の場合。

于 2010-02-16T01:10:28.263 に答える
0

これはうまくいくはずです:

Inventory.objects.filter(Q(マーケティング名=アート名) | Q(マーケティング番号=アート番号))

于 2012-11-06T03:36:25.327 に答える
0

私が見つけた簡単なことは、次のような辞書を作成することです。

query_dict = { 'marketingname' : art_name , 'marketingnumber'=art_number}

次に、python の kwargs 構文を利用してうまく渡します。つまり、

Inventory.objects.filter(**query_dict)

最初のディクショナリを作成するには、cleaned_data キーが渡されるパラメータに対応している場合、リスト内包表記を使用できますfilter()

query_dict = dict([ (k,v) for k,v in form.cleaned_data.items() if v ])

しかし、ここではそうではないようです (markettingname != artname)

于 2010-02-16T01:12:12.500 に答える
0

あなたはやってみることができます:

if art_name != '' and art_number != '':  
    artwork = Inventory.objects.filter(marketingname = art_name, marketingnumber = art_number)

try を使用するとさらに良い

try:
    artwork = Inventory.objects.filter(marketingname = art_name, marketingnumber = art_number)
except:
    # do some error handling
于 2010-07-15T18:43:13.810 に答える