如何在 Django 中将表单数据作为实例传递?

How to pass form data as instance in Django?

info: 我正在尝试做一个类似按月分期付款的应用程序(属性 或等等)。

我希望在填写客户表格和 select 产品时,我必须同时提交付款表格,付款将与该客户相关联。所以为了完成这项工作,我创建了一个 CustomerPayment 模型。我不知道 models 应该如何设计来做到这一点。

问题 我正在尝试将客户付款与客户表格一起提交,但我的表格未提交,它重定向我返回表格。我不知道如何将两个表单数据作为 CustomerPayment (customer=customer & payment=payment).

的实例传递

示例:

models.py

class Customer(models.Model):
    name = models.CharField(max_length=255)
    phone = models.CharField(max_length=11, blank=True)

class Payment(models.Model):
    collect_by = models.ForeignKey(User, on_delete=models.SET_NULL)
    customer = models.ForeignKey(Customer, on_delete=models.SET_NULL)
    datetime = models.DateTimeField(auto_now_add=True)
    amount = models.DecimalField(default=0)
    remaining = models.DecimalField(default=0)

views.py

def order_form(request):

    customer_form = CustomerForm(request.POST)
    payment_form = PaymentForm(request.POST)

    if request.method == 'POST':

        if customer_form.is_valid() and payment_form.is_valid():
            customer = customer_form.instance.sales_men = request.user
            customer.save(commit=False)

            payment = payment_form.instance.collect_by = request.user
            payment.instance.customer = customer
            payment.save(commit=False)

            return redirect('/')

    context = {
        'customer_form': customer_form,
        'payment_form': payment_form,
    }
    return render(request, "payment/payment_create.html", context)

我想你想做的事情在你看来是这样的;

def order_form(request):

    customer_form = CustomerForm()
    payment_form = PaymentForm()

    if request.method == 'POST':
        customer_form = CustomerForm(request.POST)
        payment_form = PaymentForm(request.POST)

        if customer_form.is_valid() and payment_form.is_valid():
            customer = customer.save(commit=False)
            customer.sales_men = request.user
            customer.save()

            payment = payment_form.save(commit=False)
            payment.collect_by = request.user
            payment.customer = customer
            payment.save()

            return redirect('/')

    context = {
        'customer_form': customer_form,
        'payment_form': payment_form,
    }
    return render(request, "payment/payment_create.html", context)

如果 Customer 模型只有名称和 phone 编号,您应该考虑将该数据移至 Payment。如果不出意外,它会简化您在此视图中所做的事情。

您在 Customer 上还有一个 FK,在 Payment 上也有一个 FK,它们都指向同一个 User。如果 PaymentUser.

有 FK,感觉会更简单

User 模型已经有了一个名称,因此您可以删除 Customer 模型,其中仍然需要数据制作一个 Profile 模型,该模型具有 user = models.OneToOneField()。然后 request.user.profile 会给你一个额外数据的用户配置文件