如何将模型的当前值从视图转换为另一个视图?

时间:2017-01-27 01:23:33

标签: python django django-views

我有一个网站,我想在显示用户从结账处重定向到谢谢页面后购买的产品名称。

问题在于,如果不在模板中创建表单,我就无法将视频中的数据发送到另一个视图。

以下是 checkout_paymen t到 checkout_confirmation 页面的两个视图示例:

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 Gig 包含:usertitleprice字段。

urls.py: name='purchase_confirmation_detail'

有没有办法让最后购买的数据避免使用表格或网址来获取产品信息?

1 个答案:

答案 0 :(得分:1)

简单快捷的方式:会话

如果你只需要一个字符串列表或一个字符串,你可以使用sessions。您可以在文档中详细了解它们。只需将名称保存在某个键中,显示它们并清除它们。

更好,更具未来性的解决方案,但稍微复杂一点:模型

当您在销售产品时,最好保留一些用户购买的记录。当系统出现故障(相信我,它会)或保留所有内容的记录时,这可能会有所帮助。

它可以是简单的事情:

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

现在,您可以通过两种方式重构视图:

  1. 只有交易中的用户才能看到其中的内容。
  2. 将Gig的pk添加到您重定向到的网址。
  3. 您的源视图应使用重定向,如:

    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})
    

    现在您可以访问所需的所有内容。