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')
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? –
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
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. –