10

Sto cercando di creare un modulo dinamico che utilizza una relazione modelli per generare il formset.Modulo dinamico Django, moduli con matrice HTML

Ecco una breve panoramica dell'applicazione. Ho una tabella clienti (unita alla tabella utente admin di django), tabella prodotti, tabella degli ordini e alcune tabelle di join. La tabella customer_product contiene un modulo d'ordine pre-costruito che può essere modificato. Uso alcune tabelle di join per creare nuove istanze che possono essere referenziate dalla tabella degli ordini per i dati storici.

`Cliente ha relazione uno a uno con la tabella utente

customer table 
-------------- 
id 


product table 
------------- 
id | product_id 

` Cliente ha e appartiene a molti prodotti

customer_product (pre-built order templates) 
---------------- 
id | customer_id | product_id 

'cliente ha e appartiene a molti prodotti. Cliente ha molti ordini

customer_product_order (customer initiated order) 
---------------------- 
id | customer_id | product_id | order_id | quantity 

order (main order table. each record contains meta data for that order) 
------- 
id | invoice_number | delivery_date 

non so come usare formsets in questo caso, che vi permetterà di essere costruire forma dinamica e salvare ad un tavolo e tavolo customer_product_order ordine. Attualmente ho il modulo di output ma sta controllando la tabella customer_product la seconda volta invece di lasciare che forms.py lo oncstruct. Inoltre non poteva costruire l'array html nella pagina forms.py.

models.py

from django.conf import settings 
from django.db import models 
from datetime import datetime 
import pprint 

class Customer(models.Model): 
    customer = models.ForeignKey(settings.AUTH_USER_MODEL, limit_choices_to={'groups__name': "customers"}) 
    customer_product = models.ManyToManyField('Product', through='CustomerProduct') 
    company_name = models.CharField(max_length=255) 
    address1 = models.CharField(max_length=255) 
    address2 = models.CharField(max_length=255) 
    city = models.CharField(max_length=255) 
    state = models.CharField(max_length=255) 
    zip_code = models.CharField(max_length=255) 
    created_date = models.DateTimeField('date created') 
    def __unicode__(self): 
     return self.company_name 

class CustomerProduct(models.Model): 
    customer = models.ForeignKey('Customer') 
    product = models.ForeignKey('Product') 
    def __unicode__(self): 
     return self.customer.company_name 

class Product(models.Model): 
    item = models.CharField(max_length=255) 
    description = models.CharField(max_length=255) 
    def __unicode__(self): 
     return self.description 

class Order(models.Model): 
    customer_product_order = models.ManyToManyField('CustomerProduct', through='CustomerProductOrder') 
    purchase_order_number = models.CharField(max_length=10) 
    person_placing_order = models.CharField(max_length=255) 

class CustomerProductOrder(models.Model): 
    order = models.ForeignKey('Order') 
    customer_product = models.ForeignKey('CustomerProduct') 
    quantity = models.IntegerField(default=0) 
    instructions = models.CharField(max_length=2000) 
    order_correct = models.BooleanField() 
    def __unicode__(self): 
     return self.customer_product.customer.company_name 

    class Meta: 
     verbose_name = "Customer Order" 

forms.py

from django import forms 

from .models import CustomerProduct 

class OrderForm(forms.Form): 
    def __init__(self, *args, **kwargs): 
     products = CustomerProduct.objects.filter(customer_id=1) 

     super(OrderForm, self).__init__(*args, **kwargs) 
     counter = 1 
     for q in products: 
      self.fields['product[quantity][' + str(q.id) + ']' + str(counter)] = forms.CharField(required=False) 
      self.fields['product[item][' + str(q.id) + ']' + str(counter)] = forms.CharField(required=False) 
      self.fields['product[description][' + str(q.id) + ']' + str(counter)] = forms.CharField(required=False) 
      counter += 1 

    purchase_order_number = forms.CharField(required=True) 
    person_placing_order = forms.CharField(required=True) 
    delivery_date_request = forms.DateField(required=True,widget=forms.DateInput(attrs={'class':'datepicker'})) 
    instructions = forms.CharField(required=False,widget=forms.Textarea(attrs={'rows': 5, 'cols': 100, 'class': 'form-control'})) 
    confirm_order = forms.BooleanField(required=True) 

views.py

from django import forms 

from .models import CustomerProduct 

class OrderForm(forms.Form): 
    def __init__(self, *args, **kwargs): 
     products = CustomerProduct.objects.filter(customer_id=1) 

     super(OrderForm, self).__init__(*args, **kwargs) 
     counter = 1 
     for q in products: 
      self.fields['product[quantity][' + str(q.id) + ']' + str(counter)] = forms.CharField(required=False) 
      self.fields['product[item][' + str(q.id) + ']' + str(counter)] = forms.CharField(required=False) 
      self.fields['product[description][' + str(q.id) + ']' + str(counter)] = forms.CharField(required=False) 
      counter += 1 

    purchase_order_number = forms.CharField(required=True) 
    person_placing_order = forms.CharField(required=True) 
    delivery_date_request = forms.DateField(required=True,widget=forms.DateInput(attrs={'class':'datepicker'})) 
    instructions = forms.CharField(required=False,widget=forms.Textarea(attrs={'rows': 5, 'cols': 100, 'class': 'form-control'})) 
    confirm_order = forms.BooleanField(required=True) 

modello

{% extends "base.html" %} 

{% block orderform %} 
    {% if form.errors %} 
     <p style="color: red;"> 
      Please correct the error{{ form.errors|pluralize }} below. 
     </p> 
    {% endif %} 

    <form action="/onlineordering/" method="POST"> 

     <form class="form-inline"> 

      {% csrf_token %} 

      <div class="row"> 
       <div class="col-md-6"> 

        <div class="form-group"> 
         <div class="row"> 
          <div class="col-md-5"><label for="exampleInputName2">Date</label></div> 
          <div class="col-md-7">{{ datenow }}</div> 
         </div> 
        </div> 

        <div class="form-group"> 
         <div class="row"> 
          <div class="col-md-5"><label for="exampleInputName2">Customer ID:</label></div> 
          <div class="col-md-7">{{ username }}</div> 
         </div> 
        </div> 

        <div class="form-group"> 
         <div class="row"> 
          <div class="col-md-5"><label for="exampleInputName2">Address</label></div> 
          <div class="col-md-7"> 
           1 Main Street<br /> 
           Town<br /> 
           State<br /> 
          </div> 
         </div> 
        </div> 

        <div class="form-group"> 
         <div class="row"> 
          <div class="col-md-5"><label for="exampleInputName2">Purchase Order Number</label></div> 
          <div class="col-md-7">{{ form.purchase_order_number }}</div> 
         </div> 
        </div> 
        <div class="form-group"> 
         <div class="row"> 
          <div class="col-md-5"><label for="exampleInputEmail2">Person Placing Order</label></div> 
          <div class="col-md-7">{{ form.person_placing_order }}</div> 
         </div> 
        </div> 
        <div class="form-group"> 
         <div class="form-group"> 
          <div class="row"> 
           <div class="col-md-5"><label for="exampleInputEmail2">Requested Delivery Date</label></div> 
           <div class="col-md-7">{{ form.delivery_date_request }}</div> 
          </div> 
         </div> 
        </div> 

       </div> 
       <div class="col-md-6"> 
        <p class="text-right"> 

        </p> 
       </div> 
      </div> 

      <table class="table table-bordered online-ordering-table"> 
       <tr> 
        <th width="10%">Quantity</th> 
        <th width="20%">Item</th> 
        <th width="70%">Description</th> 
       </tr> 

       {% for product in products %} 

       <tr> 
        <td><input name="product_quantity" /></td> 
        <td>{{ product.product.item }}</td> 
        <td>{{ product.product.description }}</td> 
       </tr> 

       {% endfor %} 

      </table> 

      <div class="form-group"> 
       <label for="exampleInputEmail2">Special Instructions/Comments</label> 
       {{ form.instructions }} 
      </div> 

      <div class="form-group"> 
       <div class="checkbox"> 
        <label> 
         {{ form.confirm_order }} I concede the order above is correct and authorize Company to fulfill this order 
        </label> 
       </div> 
      </div> 

      <input class="btn" type="submit" value="Submit"> 
     </form> 

    </form> 
{% endblock %} 

UPDATE

Per quanto riguarda i commenti sui modelli. Ho dettagliato le relazioni sopra nel modo migliore possibile. Il design e i requisiti dell'app sono i seguenti. Ogni cliente ha un utente. Un foglio di ordine cliente è precostruito dagli amministratori e memorizzato nella tabella customer_product. Il cliente appartiene ai prodotti e al cliente hamanyorders. Quando viene effettuato un ordine dal cliente, viene aggiunto un nuovo record di ordine e viene compilata la tabella di join customer_products_order, insieme alle quantità di ciascun prodotto.

La tabella customer_product è precompilata dagli amministratori. Il customer_product_order (join) e la tabella degli ordini vengono compilati dai clienti.

Stavo usando il seguente join per ottenere le informazioni sui clienti dal modello di ordine. Non sono riuscito a trovare nessun altro modo per unire in modo ricorsivo alla tabella clienti dal modello di ordine. Potrei sbagliarmi. Anche se questo è oltre questa domanda, apprezzo molto qualsiasi commento sul mio codice!

models.ManyToManyField('CustomerProduct', through='CustomerProductOrder') 
+0

Prima di entrare nei dettagli della generazione di moduli dinamici, sono un po 'curioso sulle tue classi di modelli. Potresti fornire maggiori dettagli sull'intenzione di ogni "modello"? In particolare, il tuo design sembra che tu voglia essere in grado di avere ** clienti diversi ** per un ** singolo ordine **, è intenzionale? –

+0

No, non è intenzionale. La mia intenzione non è quella di avere clienti diversi per un singolo ordine. Azienda = cliente. Quando viene effettuato l'ordine, il campo per "ordine di inserimento persona" è il dipendente che ha effettuato l'ordine nel giorno. – madphp

+0

Nella progettazione, 'Ordine' ha ** molti **' CustomerProduct's. Poiché ciascun 'CustomerProduct' ha un' Customer', risulta che un singolo 'Order' può avere diversi' Customer's. Inoltre, poiché la relazione ManyToMany è bidirezionale, lo stesso 'CustomerProduct' può far parte di diversi' Order's.Tutte queste scelte vanno contro il design intuitivo (ad esempio, violando il fatto che esiste un solo "Cliente" per ogni dato "Ordine"). Penso che dovresti fornire maggiori dettagli sull'intenzione dietro ciascuna delle tue classi di "Modello" e sulle tue decisioni di progettazione, al fine di ricevere alcune risposte. –

risposta

2

Dalla discussione abbiamo iniziato nei commenti e la risposta aggiornato, non sono sicuro circa lo scopo di voi customer_product tavolo? Aggiornerò la mia risposta se finalmente la raggiungerò.

(sarebbe in realtà mi sembra che il vostro customer_id campo in customer_product modello è ridondante con il campo customer_id in customer_product_order, rendendo il tavolo customer_product in realtà non utile.)


di modellare un sistema di prodotto ordinazione, potresti forse spostare il livello order al livello order (da quello che ho capito delle tue esigenze, c'è un Customer ha molti ordini, ma e l'ordine ha un cliente singolo, che il progetto attuale non riesce a implementare t), dandovi:

product_order 
---------------------- 
id | product_id(ForeignKey) | order_id(ForeignKey) | quantity 

order 
------- 
id | customer_id(ForeignKey) | invoice_number | delivery_date 

Se questo modello potrebbe soddisfare le vostre necessità, è possibile chiarire qual è la domanda che si trovano ad affrontare?


EDIT: Penso che la modellazione dei dati è leggermente fuori, e non è trasmettere il messaggio giusto su ciò che si sta tentando di raggiungere (il che rende complicato per aiutare;). In particolare: prodotti hasand belongstomany

clienti

sembra che potrebbe essere un equivoco: Perché un cliente appartenere ad un prodotto?
Sembra più naturale che lo abbia una relazione da molti a uno con istanze Order. E un Order avrebbe un molti-a-uno rapporto con Products, potenzialmente si è unito attraverso una tabella esterna che contiene il quantity campo (vale a dire, il vostro CustomerProductOrder tabella).

che si darebbe questo modello aggiornato e semplificato:



    customer table 
    -------------- 
    id | ... 


    product table 
    ------------- 
    id | description | ... 


    order 
    ------- 
    id | customer_id(ForeignKey) | person_placing_order | invoice_number | delivery_date 


    order_content (~= customer_product_order) 
    ---------------------- 
    id | order_id(ForeignKey) | 
             
  
    customer_id 
   | product_id(ForeignKey) | product_quantity 


Potrebbe spiegare il motivo per cui questo motivo Altri banale non sarebbe stato adatto per il vostro scopo? (Sperando che ci consenta di capire meglio le tue esigenze)

+0

La tabella customer_product è precompilata dagli amministratori. Il customer_product_order (join) e la tabella degli ordini vengono compilati dai clienti. – madphp

+0

@madphp E qual è lo scopo di questa tabella popolata dagli amministratori? È solo una forma alternativa di ordine: o il cliente crea l'ordine da solo, o gli amministratori lo fanno? –

+0

Un altro scenario sarebbe. Ho fatto un ordine con un foglio di prodotti. L'amministratore arriva in un secondo momento e rimuove un prodotto dalla tabella customer_product, ma quel vecchio prodotto è ancora referenziato nella tabella customer_product_order. Il suo scopo principale è per i dati storici. – madphp

Problemi correlati