简体   繁体   English

如何使用Django内联表单?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM