Oi gente!
Sou novo no Python e estou fazendo uma aplicação básica com Django.
A parte de delete, create e list da aplicação funciona, porém estou utilizando um inline_formset para a ação de update e a mesma não funciona.
Tenho os modelos Pizza e ValorPizza…
quando dou o create tudo funciona bem, porém no update apenas os dados da pizza muda e o dos valores não…
O que pode ser?
Segue:
from django.http import HttpResponse
from django.shortcuts import render, redirect
from django.views.generic import ListView
from django.views.generic.edit import DeleteView, ModelFormMixin
from django.core.urlresolvers import reverse_lazy
from django.forms import inlineformset_factory
from .models import Pizza, Ingrediente, ValorPizza
from .forms import CadastroPizzaForm, CadastroIngredienteForm, ValorPizzaFormSet
def edita_pizza(request,pk):
template_name = 'cadastro_pizza/cadastro-pizza.html'
pizza = Pizza.objects.get(pk=pk)
context = {}
if request.method == 'GET':
form = CadastroPizzaForm(instance=pizza)
formset = ValorPizzaFormSet(instance=pizza)
context['form'] = form
context['formset'] = formset
return render(request, template_name, context)
if request.method == 'POST':
form = CadastroPizzaForm(request.POST, instance=pizza)
formset = CadastroPizzaForm(request.POST, instance=pizza)
if form.is_valid():
form.save()
formset.save(commit=True)
return redirect('pizzas:lista-pizzas')
def novo_ingrediente(request):
template_name = 'cadastro_pizza/cadastro-ingrediente.html'
context = {
'form':CadastroIngredienteForm
}
if request.method == 'GET':
return render(request, template_name, context)
if request.method == 'POST':
form = CadastroIngredienteForm(request.POST)
if form.is_valid:
form.save()
return redirect('pizzas:lista-pizzas')
from django.core.urlresolvers import reverse
from django.db import models
# Create your models here.
class Ingrediente(models.Model):
nome = models.CharField('nome', max_length=100, null=False, blank=False)
descricao = models.CharField('descrição', max_length=255, null=False, blank=False)
def __str__(self):
return self.nome
class Meta:
db_table = 'ingredientes'
verbose_name = 'Ingrediente'
verbose_name_plural = 'Ingredientes'
class Pizza(models.Model):
sabor = models.CharField('sabor', max_length=100, null=False, blank=False, unique=True)
descricao = models.CharField('descrição', max_length=255, null=False, blank=False)
ingredientes = models.ManyToManyField(Ingrediente, verbose_name='ingredientes', blank=True)
def get_absolute_url(self):
return reverse('pizzas:lista-pizzas')
def __str__(self):
return self.sabor
class Meta:
db_table = 'pizzas'
verbose_name = 'Pizza'
verbose_name_plural = 'Pizzas'
class ValorPizza(models.Model):
PIZZA_SIZES = (
(1, 'Broto'),
(2, 'Grande')
)
tamanho_pizza = models.IntegerField('tamanho pizza', choices=PIZZA_SIZES, default=2, null=False, blank=False)
quantia = models.DecimalField(max_digits=5, decimal_places=2, blank=False, null=False)
pizza = models.ForeignKey(Pizza, verbose_name='pizza', related_name='valores')
class Meta:
db_table = 'valores_pizza'
verbose_name = 'Valor'
verbose_name_plural = 'Valores'
from django.forms import ModelForm, Textarea, TextInput, NumberInput, CheckboxSelectMultiple, MultipleChoiceField, ChoiceField, Select
from django.utils.translation import ugettext_lazy as _
from django.forms import inlineformset_factory
from .models import Pizza, Ingrediente, ValorPizza
PIZZA_SIZES = (
(1, 'Broto'),
(2, 'Grande')
)
class CadastroPizzaForm(ModelForm):
class Meta:
model = Pizza
fields = ['sabor', 'descricao', 'ingredientes']
labels = {
'sabor': _('Sabor:'),
'descricao': _('Descrição:'),
'ingredientes': _('Ingredientes:')
}
widgets = {
'sabor': TextInput(attrs={'class':'form-control'}),
'descricao': Textarea(attrs={'rows':'5', 'class':'form-control'}),
'ingredientes': CheckboxSelectMultiple(),
}
ValorPizzaFormSet = inlineformset_factory(Pizza,
ValorPizza,
fields=('quantia', 'tamanho_pizza'),
widgets={'quantia': TextInput(attrs={'class':'form-control'}), 'tamanho_pizza':Select(choices=PIZZA_SIZES, attrs={'class':'form-control'})},
extra=1,
max_num=2)
class CadastroValorPizza(ModelForm):
class Meta:
model = ValorPizza
fields = ['quantia', 'tamanho_pizza']
labels = {
'quantia': _('Valor:'),
'tamanho_pizza': _('Tamanho:')
}
widgets = {
'quantia': TextInput(attrs={'class':'form-control'}),
'tamanho_pizza': ChoiceField(widget=Select(attrs={'class':'selector'})),
}
Da uma força ai gente.