[英]How to work with Django inline forms?
I have two models (Receipt and Ingredient) and want to create ingredients when creating receipt. 我有两个模型(收据和配料),并且想要在创建收据时创建配料。
forms.py 表格
from django import forms
from django.forms import ModelForm
from django.forms.models import inlineformset_factory
from .models import Receipt, Ingredient, CookingStep
class ReceiptForm(forms.ModelForm):
class Meta:
model = Receipt
fields = ('name', 'description', 'hour', 'minute', 'multivarka',)
ReceiptFormSet = inlineformset_factory(Receipt, Ingredient, fields=('name', 'count', 'value'))
models.py models.py
from django.db import models
class Receipt(models.Model):
name = models.CharField(max_length=255)
description = models.TextField(max_length=1024)
hour = models.IntegerField(default=0)
minute = models.IntegerField(default=1)
multivarka = models.BooleanField(default=False)
def __str__(self):
return "%s" % (self.name)
class Ingredient(models.Model):
name = models.CharField(max_length=255)
count = models.IntegerField(default=0) #200gr, 1kg etc
value = models.CharField(max_length=255) #gramm, kg etc
receipts = models.ForeignKey(Receipt)
def __str__(self):
return "%s" % (self.name)
views.py views.py
def receipt_new(request):
if request.method == "POST":
formset = ReceiptForm(request.POST)
if formset.is_valid():
created_receipt = formset.save(commit=False)
new_formset = ReceiptFormSet(request.POST, instance=created_receipt)
if new_formset.is_valid():
created_receipt.save()
new_formset.save()
return redirect('/receipts')
else:
formset = ReceiptForm()
inline_form = ReceiptFormSet()
return render(request, 'admin_site/receipt_edit.html', {'formset': formset})
receipt_edit.html receive_edit.html
{% block content %}
<h1>New receipt</h1>
<form method="POST" class="post-form">{% csrf_token %}
{{ formset.as_p }}
<button type="submit" class="save btn btn-default">Save</button>
</form>
{% endblock %}
Now only form for creating receipt is displayed. 现在仅显示用于创建收据的表格。 I want to have two forms on edit page: firstly form for receipt and then form for creating ingredient for this receipt (on one page).
我想在编辑页面上有两个表单:首先是用于收据的表单,然后是用于为此收据创建成分的表单(在一页上)。
Firstly, use some consistent names for your variables. 首先,为变量使用一些一致的名称。 Your
ReceiptForm
instance is a form, not a formset, so call it form
. 您的
ReceiptForm
实例是一个表单,而不是表单集,因此将其称为form
。 Let's call your ReceiptFormSet
instance formset
everywhere. 让我们把你的
ReceiptFormSet
例如formset
无处不在。
Next, you need to include your form and formset in the template context when you call render
. 接下来,调用
render
时,需要在模板上下文中包括表单和表单集。
def receipt_new(request):
if request.method == "POST":
form = ReceiptForm(request.POST)
if form.is_valid():
created_receipt = form.save(commit=False)
formset = ReceiptFormSet(request.POST, instance=created_receipt)
if formset.is_valid():
created_receipt.save()
formset.save()
return redirect('/receipts')
else:
form = ReceiptForm()
formset = ReceiptFormSet(instance=Receipt())
return render(request, 'admin_site/receipt_edit.html', {'form': form, 'formset': formset})
Finally, you need to include your form and formset in the template. 最后,您需要在模板中包括表单和表单集。
<form method="POST" class="post-form">{% csrf_token %}
{{ form }}
{{ formset }}
<button type="submit" class="save btn btn-default">Save</button>
</form>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.