Escolar Documentos
Profissional Documentos
Cultura Documentos
Felipe Frizzo
Modelo e Formulário
De maneira mais basica faremos uma lista de pedidos, onde poderemos adicionar um ou mais
produtos por pedido. Teriamos um modelo e um formulário como o exemplo abaixo.
# models.py
from django.db import models
class Order(models.Model):
client = models.CharField()
date = models.DateField(auto_now_add=True)
class ItemOrder(models.Model):
order = models.ForeignKey('Order')
product = models.CharField()
quantity = models.PositiveIntegerField()
price = models.DecimalField(max_digits=20, decimal_places=2)
# forms.py
from django import forms
from cadastro.models import Order, ItemOrder
class OrderForms(forms.ModelForm):
class Meta:
model = Order
exclude = ['date']
https://felipefrizzo.github.io/post/form-inline/ 1/5
11/03/2023, 07:46 Formulários dinâmicos com inlineformset_factory em uma aplicação Django // Felipe Frizzo
class ItemOrderForms(forms.ModelForm):
class Meta:
model = ItemOrder
exclude = ['order']
Agora iremos criar a nossa view para podermos exibir e renderizar o formulário para que
conseguimos criar um pedido com um ou vários items.
# views.py
from django.forms.models import inlineformset_factory
from django.http.response import HttpResponseRedirect
from django.shortcuts import render
def order(request):
order_forms = Order()
item_order_formset = inlineformset_factory(Order, ItemOrder, form=ItemOrderFo
if request.method == 'POST':
forms = OrderForms(request.POST, request.FILES, instance=order_forms, pre
formset = item_order_formset(request.POST, request.FILES, instance=order_
else:
forms = OrderForms(instance=order_forms, prefix='main')
formset = item_order_formset(instance=order_forms, prefix='product')
context = {
'forms': forms,
'formset': formset,
}
https://felipefrizzo.github.io/post/form-inline/ 2/5
11/03/2023, 07:46 Formulários dinâmicos com inlineformset_factory em uma aplicação Django // Felipe Frizzo
Template
{% extends 'base.html' %}
{% load crispy_forms_tags %}
{% block head_title %}{{ template_title }}{% endblock %}
{% block content %}
<script>
$(document).ready(function(){
$("#add-item").click(function(ev) {
ev.preventDefault();
var count = $('#order').children().length;
var tmplMarkup = $("#item-order").html();
var compiledTmpl = tmplMarkup.replace(/__prefix__/g, count);
$("div#order").append(compiledTmpl);
<div class="row">
<div class="col-md-6 col-md-offset-3">
<h1 class="page-header text-center lead">Cadastro Pedido</h1>
</div>
</div>
<div class="row">
<div class="col-md-8 col-md-offset-2">
https://felipefrizzo.github.io/post/form-inline/ 3/5
11/03/2023, 07:46 Formulários dinâmicos com inlineformset_factory em uma aplicação Django // Felipe Frizzo
<legend class="lead">PRODUTOS</legend>
No nosso template precisamos de uma função em JavaScript para adicionar novos formulários
de items a cada vez que for clicado no botão Add Item . Essa função irá primeiro descobrir quantos
formulários foram renderizados e em seguida vai adicionar um novo item ao formulário do Pedido .
E por ultimo irá atualizar o total de formulários de items que foram incluídos.
Documentação:
https://docs.djangoproject.com/en/1.9/ref/forms/models/#inlineformset-factory
< Formulários dinâmicos com inlineformset_factory em uma aplicação Django utilizando Class-Based View
https://felipefrizzo.github.io/post/form-inline/ 4/5
11/03/2023, 07:46 Formulários dinâmicos com inlineformset_factory em uma aplicação Django // Felipe Frizzo
3 Comments
1 Login
Name
1 0 Reply • Share ›
Obrigado Marcelo :D
0 0 Reply • Share ›
giooo-. − ⚑
a year ago
Estava enfrentando dificuldades com isso, você não faz ideia do quanto me ajudou.
Esclarecedor, obrigado pelo post!
0 0 Reply • Share ›
https://felipefrizzo.github.io/post/form-inline/ 5/5