2017-01-25 7 views
-2

私はdjangoの一括更新機能を開発中です。私は自分のデータベースにデータを表示するテーブルを持っており、ユーザーは編集したいオブジェクトを選択します。選択すると、「一括更新」ボタンがクリックされ、それらがdjango ModelFormに移動します。このページの部分図は、ある:オブジェクト変数をdjangoの 'form.is_valid():'関数に渡します

def BulkUpdate(request): 
    c = {} 
    c.update(csrf(request)) 
    if request.method == "POST": 
    pks = request.POST.getlist("selection") 
    selected_objects = mymodel.objects.filter(pk__in=pks) 
    form = BulkUpdateForm(request.POST) 
    print (selected_objects) 
    if form.is_valid(): 
     gender = form.data['gender'] 
     print (gender) 
     print (selected_objects) 
    return render(request, 'bulkUpdate.html', {'form': form }) 

最初print (selected_objects)が正常クエリセットに内前のテンプレートから選択されたすべてのオブジェクトを印刷します。ただし、2番目のprint (selected_objects)は空のQuerySetを返します。 3つのオブジェクトが選択されている場合たとえば、私の端末は

<QuerySet [<model: model object>, <model: model object>, <model: model object>]>

が印刷されますが、私は私のコードでそれを2回印刷していますので、有効なフォームの送信時にそれが

<QuerySet []> <QuerySet []>

つを印刷します..

私の主な質問は、どのように私のform.is_valid()関数にこれらの3つのオブジェクトを得ることができます。私は変数selected_objectsを両方の呼び出しで同じ方法で印刷したいと思います。助けやアドバイスは素晴らしいです。あなたの時間をありがとう。

+2

それはちょうどそのようにすることはできません。同じクエリーセットを2回印刷すると結果は同じになります。私は 'form.is_valid()'がFalseで、あなたのコードのどこかにもう2枚の印刷物があると確信しています。 – Raz

+0

残念ながら、そうではありません。私はそうだった。私はジェンダーの入力が返されたので、関数が呼び出されていることを知っています。最初は一括更新ボタンを押してフォームページに移動したときにオブジェクトを取得しますが、フォームを送信すると選択されたオブジェクトにアクセスできなくなったと思いますか?空のクエリーセットを返します。多分トークンを使うことを考えていたのですか?しかし、私はトークンの経験があまりなく、それが安全な方法であるかどうかは分かりません。 – Ozie

+0

'print(pks)'の値は何ですか?空のリストの場合は、フォームを送信するときにPOSTデータに 'selection'を含めません。 – Alasdair

答えて

0
def BulkUpdate(request): 
    if request.method == "POST": 
     pks = request.POST.getlist("selection") 
     form = BulkUpdateForm(request.POST) 
     pk_string = "/".join(str(i) for i in pk_list) 
     if form.is_valid(): 
      url = request.path 
      pk_mod=url[33:].split('/') 
      objects = mymodel.objects.filter(pk__in=pk_mod) 
      gender = form.data['gender'] 
      for i in objects: 
       i.gender = gender 
       i.save() 
       print('done') 
     return HttpResponseRedirect(pk_string) 
    else: 
     form = BulkUpdateForm(request.POST) 
     return render(request, 'bulkUpdate.html', {'form':form }) 

PK年代を除去し、メソッドを使用して、私のオブジェクトをフィルタするためのURLを使用して、その後、URLでのPKのを節約しながら、私は正常に選択したオブジェクトのPK年代を取得するには、このメソッドを使用し、フォームテンプレートにそれを取ります私は以前に使った。そこから、BulkUpdateForm()genderに入力された入力は、選択したすべてのオブジェクトの性別フィールドを置き換えます。誰もが助けてくれてありがとう、うまくいけば私のスニペットは後で誰かを助けることができる。

関連する問題