Sorun, iyi programlama uygulamaları ve her şeyden önce Django hakkındaki bilgi eksikliğim nedeniyle biraz uzun. Önerileri takdir ediyorum. (Basitleştirilmiş)Model formları içeren django'da bir programlama deseni ile yardım edin
Modeli
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)
#...
sorun
iki çok benzer abonelik işlemleri vardır. Biri yeni kullanıcılar ve diğer kullanıcılar için.
Yeni kullanıcılar için abonelik işlemi, Müşterinin kişisel verilerini ve ödeme bilgilerini Müşteri tablosunda doldurmayı ve en az bir Abonelik oluşturmayı içerir. Her Abonelik bir Ürün anlamına gelir. Sürecin sonunda tüm bu Abonelikler için bir Fatura üretilir. Fatura modelinin burada gerekli olmadığını düşünüyorum, ancak yararlı olması durumunda onu buraya koydum. Her Abonelik, uygulamaya giriş yapmak için bir django-contrib-auth kullanıcısına sahiptir.
İlk Abonelik ana aboneliği'dur. Bu Abonelikle ilişkili Kullanıcı, diğer abonelikleri yenileyebilir veya iptal edebilir ve yenilerini satın alabilir. Bu yeni işlem gerekirse ödeme bilgilerini değiştirmeyi içerir, ancak Müşteri için kişisel veriler yoktur. Ve yeni olanların mevcut Aboneliklerini ayırt etmeliyiz.
Formlar Üç ModelForms oluşturduk Müşteri İçin
: açmış abonelik sürecinde kullanıcılar giriş için
PaymentForm tek başına kullanıldığında
class PaymentForm(forms.ModelForm):
class Meta:
model = Customer
fields = (
'pay_method',
'bank_code',
'bank_office_code',
'bank_control_digit',
'bank_account_number'
)
# ...
DataForm tek başına kullanıldığında Abonelik, abonelik sürecinden Müşteri kişisel bilgilerini düzenlemek için ana abonelik olan kullanıcılarda.
- RenewalsFormSet:
class DataForm(forms.ModelForm): class Meta: model = Customer fields = ( 'first_name', 'last_name', # All the other fields ) # ...
NewCustomerForm PaymentForm ve dataform
İki formsets olması gerektiğini düşünüyorum Abonelikler içinclass NewCustomerForm(MyDataForm, PaymentForm): class Meta: model = Customer fields = MyDataForm.Meta.fields + PaymentForm.Meta.fields
(? Inline formsets) karıştırma bir form oluşturmak için benim için çalıştı: Giriş yapmış kullanıcılar için mevcut abonelikleri iptal etme veya yenileme. Kullanıcı bilgileri düzenleyemez, yalnızca iptal edebilir veya yenileyebilir.
- AboneliklerFormSet: Kayıtlı ve oturum açmamış kullanıcılar için, yeni abonelikler eklemek için.
Her iki durumu da en basit şekilde nasıl ele alabilirim? Yeni abonelik formları mevcut abonelikler hakkında bilgi sahibi olmamalıdır.
Ve soru Django görüş açısından abonelik süreç olacağını
geçerli:
- GET formu görünümü: Formlar kullanıcıya sunulmaktadır.
- POST formları: Formlar doğrulandı. Hata varsa: 1. noktaya gidin. Başarı durumunda: POST verilerini oturumda saklayın.
- GET onay görünümü: Satın alınacak ürünlerin özeti.
- GET onayla Ödeme: Seçilen ödeme yöntemine bağlı olarak, burada işlem değişebilir.
- GET teşekkür sayfası
hem açmış ve kullanıcılara Giriş yapmadınız için tek bir abonelik süreci için ne yapabilirim?
Girdiyi alan ve müşteriyi (önceden kayıtlı olup olmamasına bağlı olarak var olan veya olmayan) tüm abonelikler ve kullanıcılar ile birlikte veritabanında saklanmaya hazır olan bir kara kutu gibi bir nesneyi düşündüm. .
Ama nasıl yapılacağını bilmiyorum.
(o ana kadar okunan çok güzel olmalı ki ettiyseniz. Teşekkürler!)
Cevabınız için teşekkür ederiz. Benim cehaletim, esas olarak, bu "blackbox" ı yapmamı engelleyen şeydir. Bunu yapmak için daha iyi bir desen olup olmadığını veya tek ek doğrulama ile her biri daha iyi iki kara kutuya ihtiyacım varsa bilmiyorum. – carlosescri
Sonunda bu modeli bilgi olmadan kullandım, ancak uygulamadaki ödeme süreci iş akışını basitleştirmek için çok iyi çalıştı. Yani cevap tamam. Teşekkürler! – carlosescri