我正在尝试为物流公司创建一个页面,用户可以通过此页面请求报价。我正在尝试实现一个页面,我可以在其中单击“添加产品”按钮,然后它将允许我从下拉菜单中选择产品,然后让我指定它的数量。
这是我的模型.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']
这是我的观点.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">