如何在 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
。如果 Payment
对 User
.
有 FK,感觉会更简单
User
模型已经有了一个名称,因此您可以删除 Customer
模型,其中仍然需要数据制作一个 Profile
模型,该模型具有 user = models.OneToOneField()
。然后 request.user.profile
会给你一个额外数据的用户配置文件
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
。如果 Payment
对 User
.
User
模型已经有了一个名称,因此您可以删除 Customer
模型,其中仍然需要数据制作一个 Profile
模型,该模型具有 user = models.OneToOneField()
。然后 request.user.profile
会给你一个额外数据的用户配置文件