Шаблон работает некорректно в Django
Я пытаюсь создать страницу для логистической компании, где пользователь может запросить цену через эту страницу. Я пытаюсь реализовать страницу, на которой я могу нажать на кнопку добавления товара и затем она позволит мне выбрать товар из выпадающего меню, а затем позволить мне указать количество для него.
это мой models.py
from django.db import models
from phonenumber_field.modelfields import PhoneNumberField
from django.utils import timezone
from .states import STATE_CHOICES,prod_choices
class Product(models.Model):
name = models.CharField(max_length=100,choices=prod_choices, unique=True)
def __str__(self):
return self.name
class Quote(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=60)
email = models.EmailField()
address=models.CharField(max_length=150)
ph_num= PhoneNumberField()
state=models.CharField(max_length=45,choices=STATE_CHOICES,default="State")
city=models.CharField(max_length=20,default="City")
pincode = models.CharField(max_length=10)
created_at = models.DateTimeField(auto_now_add=True)
order_id=models.CharField(max_length=255, unique=True,default="#")
process_status=models.BooleanField(default="False")
def generate_order_id(self):
state_abbreviation = self.state[:3].upper()
city_abbreviation = self.city[:3].upper()
current_datetime = timezone.now().strftime('%Y%m%d%H%M%S')
order_id = f"{state_abbreviation}_{city_abbreviation}_{self.name}_{current_datetime}"
return order_id
def __str__(self):
return f"Quote {self.id}"
class QuoteProduct(models.Model):
quote = models.ForeignKey(Quote, on_delete=models.CASCADE)
product = models.ForeignKey(Product, on_delete=models.CASCADE)
quantity = models.PositiveSmallIntegerField(default=0)
def __str__(self):
return f"{self.product.name} - {self.quantity}"
Это мой файл forms.py
from django import forms
from .models import Quote
from .models import QuoteProduct
class QuoteForm(forms.ModelForm):
class Meta:
model = Quote
fields = ['name', 'email', 'address', 'ph_num', 'state', 'city', 'pincode']
class QuoteProductForm(forms.ModelForm):
class Meta:
model = QuoteProduct
fields = ['product', 'quantity']
Это мой views.py
from django.shortcuts import render, redirect
from .forms import QuoteForm
from .models import Quote, QuoteProduct # Corrected import
from django.forms.models import inlineformset_factory
def quote_form_view(request):
QuoteProductFormSet = inlineformset_factory(Quote, QuoteProduct, fields=('product', 'quantity'), extra=1)
if request.method == 'POST':
quote_form = QuoteForm(request.POST)
quote_product_formset = QuoteProductFormSet(request.POST)
if quote_form.is_valid() and quote_product_formset.is_valid():
quote_instance = quote_form.save(commit=False)
order_id = quote_instance.generate_order_id()
quote_instance.order_id = order_id
quote_instance.save()
quote_product_formset.instance = quote_instance
quote_product_formset.save()
return redirect('index') # Redirect to the desired page after successful submission
else:
quote_form = QuoteForm()
quote_product_formset = QuoteProductFormSet()
return render(request, 'quote.html', {'quote_form': quote_form, 'quote_product_formset': quote_product_formset})
а это моя цитата.html
{% extends 'pagetemp.html' %}
{% load static %}
{% load crispy_forms_tags %}
{% block content %}
<div class="divider">
<span>Request a quote</span>
<div class="quote-form">
<form action="" method="post">
{% csrf_token %}
{{ quote_form|crispy }}
<h3>Products</h3>
{{ quote_product_formset.management_form }}
<div id="quote-product-forms">
{% for form in quote_product_formset.forms %}
<div class="quote-product-form">
{{ form|crispy }}
</div>
{% endfor %}
</div>
<button type="button" id="add-product-btn" class="btn btn-primary">Add Product</button>
<button type="submit" class="btn btn-primary custom-btn-create-post">Submit</button>
</form>
</div>
</div>
{% endblock %}
{% block jscript %}
<script>
const formContainer = document.getElementById('quote-product-forms');
const addProductBtn = document.getElementById('add-product-btn');
const totalForms = document.getElementById('id_quote_product_set-TOTAL_FORMS');
addProductBtn.addEventListener('click', () => {
const formCopyTarget = document.querySelector('.quote-product-form');
const formCopy = formCopyTarget.cloneNode(true);
formCopy.querySelectorAll('input, select, textarea').forEach(field => {
field.name = field.name.replace(`quote_product_set-__prefix__`, `quote_product_set-${totalForms.value}`);
field.value = '';
});
formContainer.appendChild(formCopy);
totalForms.value = parseInt(totalForms.value) + 1;
});
</script>
{% endblock %}
У меня появляются прочерки в выпадающем списке и флажок удаления. Кнопка добавления товара также не работает.
Я пытался переписать models.py и forms.py, но это просто не работает.
Вы можете добавить действие на свою HTML-страницу. Например, так,
<form action="{% url '< your url >' %}" method="post">
Проблема не в моделях или формах, проблема в js скрипте! Попробуйте следующее:
let container = document.getElementById('quote-product-forms');
let addProductBtn = document.getElementById('add-product-btn');
let totalForms = document.getElementById('id_quoteproduct_set-TOTAL_FORMS');
addProductBtn.addEventListener('click', () => {
let productForms = container.querySelectorAll(".quote-product-form")
let formNum = productForms.length-1
let newForm = productForms[formNum].cloneNode(true)
let formRegex = RegExp(`quoteproduct_set-(\\d){1}-`,'g')
formNum++
newForm.innerHTML = newForm.innerHTML.replace(formRegex, `quoteproduct_set-${formNum}-`)
container.appendChild(newForm)
totalForms.setAttribute('value', `${formNum+1}`)
});
Заметьте, что я изменил "quote_product" на "quoteproduct" в функциях скрипта. Возможно, вам нужно вернуть "quote_product"