2017-01-27 6 views
0

私は、チェックアウトからありがとうページにリダイレクトされた後、ユーザーが購入した商品名を表示したいと思うウェブサイトを持っています。ビューから別のモデルに現在の値を取得する方法は?

問題は、テンプレートにフォームを作成せずに、ビューから別のビューにデータを送信する方法がわかりません。

def checkout_payment(request): 
    customer_id = request.user.profile.stripe_id 
    if request.method == 'POST': 
     try: 
      gig = Gig.objects.get(id=request.POST.get('gig_id')) 
     except Gig.DoesNotExist: 
      return redirect(reverse('purchase_error_detail')) 

    return redirect(reverse('purchase_confirmation_detail')) 


def checkout_confirmation(request): 
    #how can I get the purchased gig datas ? 
    return render(request, 'purchase/confirmation.html', {}) 

models.pyのギグが含まれています:usertitlepriceフィールド

はここcheckout_paymenトンcheckout_confirmation ページからビューの2例です。

urls.py:name='purchase_confirmation_detail'

製品の情報を取得するには、フォームまたはURLの使用を避ける最後購入した件のデータを取得する方法はありますか?

+3

現在のセッションのデータをセッション辞書に保存できます。例については、djangoのドキュメントを参照してください。 https://docs.djangoproject.com/en/1.10/topics/http/sessions/#examples –

+0

@HåkenLid私はこれが私の質問の範囲外であることを知っていますが、セッションを使用すると、確認ページは、ユーザーが 'checkout_payment'からページを入力した場合のみです。そうする方法はありますか? – Lindow

答えて

1

簡単かつ迅速な方法:セッション

あなたが必要とするすべての文字列のリストまたは単一の文字列である場合は、あなただけsessionsを使用することができます。それらについては、ドキュメントで詳しく読むことができます。名前をいくつかのキーに保存し、表示してクリアしてください。

より良い、より将来性ソリューションが、やや複雑:モデル

あなたが何かを販売しているとき、ユーザーが買ったものをいくつかの記録を周りに保つことが望ましい。これは、システムが失敗したとき(信頼する、そうする)、すべての記録を残すときに役立ちます。

それはのような単純なものになります

class Transaction(models.Model): 
    gig = models.ForeignKey(Gig) 
    user = models.ForeignKey(User) 

今、あなたは、2通りの方法であなたのビューをリファクタリング:

  1. のみトランザクション内のユーザーがそれにコンテンツを見ることができるはずです。
  2. リダイレクト先のURLにGigのpkを追加します。

あなたのソースビューは以下のようにリダイレクトを使用する必要があります。

def checkout_payment(request): 
    customer_id = request.user.profile.stripe_id 
    if request.method == 'POST': 
     try: 
      gig = Gig.objects.get(id=request.POST.get('gig_id')) 
     except Gig.DoesNotExist: 
      return redirect(reverse('purchase_error_detail')) 
    new_transaction = Transaction.objects.create(user=request.user, gig=gig) 
    return redirect(reverse('purchase_confirmation_detail', kwargs={'pk': new_transaction.pk})) 

そして、あなたの行先表示は次のようになります。今、あなたはあなたが表示するのに必要なすべてのものへのアクセスを持って

def checkout_confirmation(request, *args, **kwargs): 
    new_transaction = Transaction.objects.get(kwargs.get('pk')) 
    if request.user != new_transaction.user: 
     return HttpResponseForbidden() # You can raise Http404 here too to hide the resource, like github does 
    return render(request, 'purchase/confirmation.html', {'gig': transaction.gig}) 

+0

私は、各ユーザーの新しい購入を作成し、最後に作成したトランザクションを表示するモデルでも同様のソリューションを使用しました。正しい選択をしたことを嬉しく思います。新しいモデルを作成するかどうかわかりませんでしたちょうどこの目的のために:) – Lindow

+0

@ KasimovNuriddin正しいユーザーだけがビューにアクセスできることを確認します。 – cdvv7788

+0

はい接続しているユーザーのみをフィルタリングしました – Lindow

関連する問題