模板在 Django 中无法正常工作

问题描述 投票:0回答:1

我正在尝试为物流公司创建一个页面,用户可以通过此页面请求报价。我正在尝试实现一个页面,我可以在其中单击“添加产品”按钮,然后它将允许我从下拉菜单中选择产品,然后让我指定它的数量。

这是我的模型.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 但这不起作用。

django django-models django-views django-forms django-templates
1个回答
0
投票

您可以在 HTML 页面中添加操作。像这样,

<form action="{% url '< your url >' %}" method="post">
© www.soinside.com 2019 - 2024. All rights reserved.