I'm using django inline forms and crispy forms to make a CRUD, but I've changed the structure a little bit and the update i'snt working
I created a forms.py to organize the inputs of the regular form and the inline form, using HTML inside it.
'Forms.py'
class RegistroForm(forms.ModelForm):
cliente = forms.ModelChoiceField(queryset=Cliente.objects.all(), empty_label='Selecione um cliente...')
class Meta:
model = Registro
fields = ['cliente','totalPedido', 'tipo', 'vendedor', 'nome', 'cpf', 'email', 'rg', 'cidade', 'telefone', 'numero', 'rua', 'bairro', 'data']
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# Personalize o layout dos campos usando Crispy Forms
self.helper = FormHelper()
self.helper.form_class = 'form'
self.helper.layout = Layout(
HTML(
'''
<div class="container-fluid">
<div class="col-sm-9 col-md-8 m-auto">
{% csrf_token %}
<select class="form-select no-focus" id="id_cliente" name="cliente" onchange="update_cliente_data()">
<option value="" data-cliente='{"nome": "", "cpf": "", "email": "", "rg": "", "cidade": "", "telefone": "", "numero": "", "rua": "", "bairro": ""}'>Selecione um cliente...</option>
{% for cliente in form.cliente.field.queryset %}
<option id="opcao{{cliente.id}}" value="{{ cliente.id }}" data-cliente='{"nome": "{{ cliente.nome | title }}", "cpf": "{{ cliente.cpf }}", "email": "{{ cliente.email }}", "rg": "{{ cliente.rg }}", "cidade": "{{ cliente.cidade | title }}", "telefone": "{{ cliente.telefone }}", "numero": "{{ cliente.numero }}", "rua": "{{ cliente.rua | title }}", "bairro": "{{ cliente.bairro | title }}"}'>{{ cliente.nome | title }}</option>
{% endfor %}
</select>
'''
),
Div(
Div(Field('tipo', css_class='form-control no-focus'), css_class='col-md-5'),
Div(css_class='col-md-2'),
Div(HTML("<h4>N° {{ registro_format }}</h4>"), css_class='col-md-5 mt-4'),
css_class='row'
),
Div(
Div(Field('nome', css_class='form-control no-focus', autocomplete='off'), css_class='col-md-5'),
Div(css_class='col-md-2'),
Div(Field('cpf', css_class='form-control no-focus', autocomplete='off'), css_class='col-md-5'),
css_class='row'
),
Div(
Div(Field('email', css_class='form-control no-focus'), css_class='col-md-5'),
Div(css_class='col-md-2'),
Div(Field('rg', css_class='form-control no-focus', autocomplete='off'), css_class='col-md-5'),
css_class='row'
),
Div(
Div(HTML("<label>Vendedor</label><input class='form-control' type='text' disabled value='{{ request.user | title }}'>"), css_class='col-md-5'),
Div(css_class='col-md-2'),
Div(Field('data', css_class='form-control no-focus'), css_class='col-md-5'),
css_class='row'
),
Div(
Div(Field('cidade', css_class='form-control no-focus', autocomplete='off'), css_class='col-md-5'),
Div(css_class='col-md-2'),
Div(Field('telefone', css_class='form-control no-focus', autocomplete='off'), css_class='col-md-5'),
css_class='row'
),
Div(
Div(Field('numero', css_class='form-control no-focus', autocomplete='off'), css_class='col-md-5'),
Div(css_class='col-md-2'),
Div(Field('rua', css_class='form-control no-focus', autocomplete='off'), css_class='col-md-5'),
css_class='row'
),
Div(
Div(Field('bairro', css_class='form-control no-focus', autocomplete='off'), css_class='col-md-5'),
css_class='row'
),
HTML('''
</div>
<hr style="margin-bottom: 10px; margin-top: 20px;">
</div>
<div class="p-5">
{{ itens_formset.management_form }}
{% for formset_form in itens_formset %}
<div class="inline-formset-item">
<div class="row no-gutters">
<div class="col-md-4 p-0 m-0">
{% if forloop.first %}
<h5 class="mb-4 ms-2">Produto</h5>
{% endif %}
<select name="{{ formset_form.prefix }}-produto" id="id_produto" class="form-control select custom-select no-focus" onchange="update_produto_data(this, '{{ forloop.counter0 }}'); calculateTotal(this);">
<option value="" data-produto='{"valor": ""}'>Selecione um produto...</option>
{% for produto in produtos %}
<option id="opcaoProd{{produto.id}}" value="{{ produto.id }}" data-produto='{"valor": "{{ produto.valorVenda }}"}'>{{ produto.nome | title }}</option>
{% endfor %}
</select>
</div>
<div class="col-md-2 p-0 m-0">
{% if forloop.first %}
<h5 class="mb-4 ms-2">Quantidade</h5>
{% endif %}
<input id="id_{{ formset_form.prefix }}-quantidade" type="number" step="any" class="form-control no-focus" name="{{ formset_form.prefix }}-quantidade" placeholder="Quantidade" autocomplete="off" onchange="calculateTotal(this);">
</div>
<div class="col-md-2 p-0 m-0">
{% if forloop.first %}
<h5 class="mb-4 ms-2">Tamanho</h5>
{% endif %}
<input id="id_{{ formset_form.prefix }}-tamanho" type="text" class="form-control no-focus" name="{{ formset_form.prefix }}-tamanho" placeholder="Tamanho" autocomplete="off" onchange="calculateTotal(this)" onblur="formatarNumero(this)">
</div>
<div class="col-md-2 p-0 m-0">
{% if forloop.first %}
<h5 class="mb-4 ms-2">Valor por metro</h5>
{% endif %}
<input id="id_{{ formset_form.prefix }}-valorProd" type="number" step="any" class="form-control no-focus" name="{{ formset_form.prefix }}-valorProd" placeholder="Valor por metro" autocomplete="off" onchange="calculateTotal(this)">
</div>
<div class="col-md-2 p-0 m-0">
{% if forloop.first %}
<h5 class="mb-4 ms-2">Total</h5>
{% endif %}
<input id="id_{{ formset_form.prefix }}-totalProd" type="number" step="any" class="form-control no-focus" name="{{ formset_form.prefix }}-totalProd" placeholder="Total" autocomplete="off">
</div>
</div>
</div>
{% endfor %}
<button class="btn btn-success mt-2 mb-5" type="submit" style="width: 110px;">Salvar</button>
{% if editar %}
<a href="{% url 'registrar' %}">
<button class="btn btn-secondary mt-2 mb-5 ms-2" type="button">Voltar</button>
</a>
{% else %}
<a href="#" target="_blank">
<button class="btn btn-secondary mt-2 mb-5 ms-2" type="button">Exportar PDF</button>
</a>
{% endif %}
<div class="col-md-4">
<input type="number" name="totalPedido" id="id_totalPedido" step="any" class="form-control no-focus" autocomplete="off" placeholder="Total do pedido">
</div>
</div>
'''))
class ItemForm(forms.ModelForm):
class Meta:
model = Item
fields = ['produto','quantidade', 'tamanho','valorProd', 'totalProd']
using this, I can save the data, but I can't update and delete, because the information are not shown on the inputs
'Views.py'
class RegistroUpdate(GroupRequiredMixin, UpdateView):
group_required = [u"vendedor", u"gerente"]
model = Registro
form_class = RegistroForm
template_name = 'registrar.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
ItemFormSet = inlineformset_factory(Registro, Item, form=ItemForm, extra=4, can_delete=False)
if self.request.POST:
context['itens_formset'] = ItemFormSet(self.request.POST, instance=self.object)
else:
context['itens_formset'] = ItemFormSet(instance=self.object)
print(context['itens_formset'].management_form)
return context
def form_valid(self, form):
context = self.get_context_data()
itens_formset = context['itens_formset']
if itens_formset.is_valid():
self.object = form.save()
itens_formset.instance = self.object
itens_formset.save()
return super().form_valid(form)
else:
return self.render_to_response(self.get_context_data(form=form))
def get_success_url(self):
return self.object.get_absolute_url()
'HTML:'
<form id="registro-form" class="main-form" action="?" method="POST">
{% crispy form %}
</form>
Can someone help me, please?