Ma question est un peu longue en raison de mon manque de connaissance des bonnes pratiques de programmation et, surtout, de Django. J'apprécie toutes les suggestions.Aide avec un modèle de programmation en django qui implique des formes de modèles
Le modèle (simplifié)
class Customer(models.Model):
# Customer info
first_name = models.CharField(max_length=75)
last_name = models.CharField(max_length=179, null=True, blank=True)
# ... and more fields that need validation but not needed for the question
pay_method = models.CharField(max_length=1, choices=PAY_METHODS)
bank_code = models.CharField(max_length=4, blank=True, null=True)
bank_office_code = models.CharField(max_length=4, blank=True, null=True)
bank_control_digit = models.CharField(max_length=2, blank=True, null=True)
bank_account_number = models.CharField(max_length=10, blank=True, null=True)
class Product(models.Model):
name = models.CharField(max_length=50)
class Subscription(models.Model):
customer = models.ForeignKey(Customer)
product = models.ForeignKey(Product)
user = models.OneToOneField(User)
# ...
start_date = models.DateField(null=True)
end_date = models.DateField(null=True)
# ...
is_main_subscription = models.BooleanField(default=False)
class Invoice(models.Model):
customer = models.ForeignKey(Customer)
subscriptions = models.ManyToManyField(Subscription,null=True,blank=True)
#...
Le problème
Il y a deux processus de souscription très similaires. L'un est pour les nouveaux utilisateurs et l'autre pour les utilisateurs existants.
Pour les nouveaux utilisateurs, le processus d'abonnement consiste à renseigner les données personnelles et les informations de paiement du Client dans la table Client et à créer au moins un Abonnement. Chaque abonnement fait référence à un produit. À la fin du processus, une facture pour tous ces abonnements est générée. Je pense que le modèle Invoice n'est pas nécessaire ici mais je l'ai mis ici au cas où il serait utile. Chaque abonnement a un utilisateur django-contrib-auth pour se connecter à l'application.
Le premier abonnement est l'abonnement principal . L'utilisateur associé à cet abonnement peut renouveler ou annuler les autres abonnements et en acheter de nouveaux. Ce nouveau processus implique de modifier les informations de paiement si nécessaire, mais pas de données personnelles pour le client. Et nous devons distinguer les abonnements existants des nouveaux.
Formes
Pour le Client J'ai créé trois ModelForms:
PaymentForm est utilisé seul pour les utilisateurs connectés dans le processus d'abonnement
class PaymentForm(forms.ModelForm):
class Meta:
model = Customer
fields = (
'pay_method',
'bank_code',
'bank_office_code',
'bank_control_digit',
'bank_account_number'
)
# ...
DataForm est utilisé seul pour connecté dans les utilisateurs dont l'abonnement est l'abonnement principal pour modifier les informations personnelles du client sur le processus d'abonnement.
class DataForm(forms.ModelForm):
class Meta:
model = Customer
fields = (
'first_name',
'last_name',
# All the other fields
)
# ...
NewCustomerForm a travaillé pour moi pour créer une forme de mélange PaymentForm et DataForm
class NewCustomerForm(MyDataForm, PaymentForm):
class Meta:
model = Customer
fields = MyDataForm.Meta.fields + PaymentForm.Meta.fields
Pour les abonnements, je pense qu'il devrait y avoir deux liasses (formsets inline?):
- RenewalsFormSet: Pour les utilisateurs connectés pour annuler ou renouveler les abonnements existants. L'utilisateur ne peut pas modifier les informations, seulement annuler ou renouveler.
- SubscriptionsFormSet: Pour les utilisateurs connectés et non connectés, pour ajouter de nouveaux abonnements.
Comment pourrais-je gérer les deux cas de la manière la plus simple? Le nouveau formset d'abonnements ne doit pas avoir connaissance des abonnements existants.
Et la question est
Le processus d'abonnement du point de vue des vues Django serait:
- formulaire GET vue: Les formulaires sont présentés à l'utilisateur.
- Formulaires POST: Les formulaires sont validés. Si erreur: allez au point 1. En cas de succès: enregistrez les données POST dans la session.
- GET vue de confirmation: Résumé des produits à acheter.
- GET confirmer le paiement: Selon la méthode de paiement sélectionnée, le processus ici peut varier.
- page GET thankyou
Que puis-je faire pour avoir un seul processus d'abonnement pour les non enregistrés et les utilisateurs connectés? J'avais pensé à une sorte d'objet comme une boîte noire qui reçoit une entrée et renvoie un client (existant ou non, selon que l'utilisateur était déjà enregistré) avec tous les abonnements et utilisateurs, tous prêts à être stockés dans la base de données .
Mais je ne sais pas comment le faire.
(Si vous avez lu jusqu'à présent est que vous devez être très agréable. Merci!)
Nous vous remercions de votre réponse. Mon ignorance, principalement, est ce qui m'empêche de faire cette "blackbox". Je ne sais pas s'il existe un meilleur modèle pour le faire ou si j'ai besoin de deux boîtes noires mieux qu'une, chacune avec sa propre validation supplémentaire. – carlosescri
J'ai finalement utilisé ce modèle sans connaissance, mais cela a très bien fonctionné pour simplifier le processus de paiement dans l'application. Donc la réponse est ok. Merci! – carlosescri