2010-11-19 15 views
0

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çin
    class 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:

  1. GET formu görünümü: Formlar kullanıcıya sunulmaktadır.
  2. POST formları: Formlar doğrulandı. Hata varsa: 1. noktaya gidin. Başarı durumunda: POST verilerini oturumda saklayın.
  3. GET onay görünümü: Satın alınacak ürünlerin özeti.
  4. GET onayla Ödeme: Seçilen ödeme yöntemine bağlı olarak, burada işlem değişebilir.
  5. 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!)

cevap

1

Sana mevcut veri modeline sizin "kara kutu" modelleme sığdırmak için engeller göremiyorum.

Yapmanız gereken tek şey, kullanıcının önceden abone olup olmadığına bağlı olarak, form kümesi oluşturmayı değiştirmek. Ayrıca, formda bir kaydetme yöntemi yazarsanız, db'yi güncelleştirmek için dış ağ geçidini çağıran güncelleştirir, görünüm tam olarak aynı kalır.

Vurulduğunuz belirli bir yer var mı?

+0

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

+0

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

İlgili konular