2010-11-19 42 views
0

由於我缺乏良好的編程實踐知識,並且最重要的是Django,所以我的問題有點長。我很欣賞任何建議。django中的編程模式幫助,涉及到模型形式

模型(簡化的)

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) 
    #... 

問題

有兩個非常相似的訂閱的過程。一個用於新用戶,另一個用於現有用戶。

對於新用戶,訂購過程包括在客戶表中填寫客戶的個人數據和付款信息並創建至少一個訂閱。每個訂閱都是指產品。在流程結束時,將生成所有這些訂閱的發票。我認爲Invoice模型在這裏不是必要的,但是我把它放在這裏以防萬一它有用。每個訂閱都有一個django-contrib-auth用戶登錄到應用程序。

第一次訂閱是主要訂閱。與該訂閱相關聯的用戶可以續訂或取消其他訂閱併購買新訂閱。新流程涉及如果需要更改付款信息,但不包含客戶的個人數據。我們必須區分現有的新訂閱。

形式

對於我已經創建了三個ModelForms客戶:

PaymentForm被單獨用於登錄的用戶在訂閱過程

class PaymentForm(forms.ModelForm): 
    class Meta: 
     model = Customer 
     fields = (
      'pay_method', 
      'bank_code', 
      'bank_office_code', 
      'bank_control_digit', 
      'bank_account_number' 
     ) 
    # ... 

數據形單獨用於記錄用戶的訂閱是訂閱過程中編輯客戶個人信息的主要訂閱。

class DataForm(forms.ModelForm): 
    class Meta: 
     model = Customer 
     fields = (
      'first_name', 
      'last_name', 
      # All the other fields 
     ) 
    # ... 

NewCustomerForm爲我工作,以創建一個表單混合PaymentForm和的DataForm

class NewCustomerForm(MyDataForm, PaymentForm): 
    class Meta: 
     model = Customer 
     fields = MyDataForm.Meta.fields + PaymentForm.Meta.fields 

對於訂閱我認爲應該有兩個表單集(在線表單集?):

  • RenewalsFormSet:爲登錄用戶取消或續訂現有訂閱。用戶不能編輯信息,只能取消或更新。
  • SubscriptionsFormSet:對於已登錄和未登錄的用戶,添加新的訂閱。

我怎樣才能以最簡單的方式處理這兩種情況?新的訂閱表單不能具有現有訂閱的知識。

,問題是

從視圖中的Django點意見的訂閱過程將是:

  1. GET表單視圖:形式呈現給用戶。
  2. POST表格:表格經過驗證。如果錯誤:轉到第1點。如果成功:在會話中保存POST數據。
  3. GET確認視圖:要購買的產品摘要。
  4. GET確認付款:根據所選的付款方式,此處的過程可能會有所不同。
  5. GET三江源頁

我能做些什麼有一個單一的訂閱過程都記錄下來,在用戶沒有登錄?

我曾經考慮過某種類似黑箱的對象,它接收所有訂閱和用戶的輸入並返回一個客戶(已存在與否,取決於用戶是否已註冊),所有這些都準備好存儲在數據庫中。

但我不知道該怎麼做。

(如果你讀過到目前爲止,你必須是非常好的。謝謝!)

回答

1

我看不出有什麼阻止你適合你的「黑盒」造型,以現有的數據模型。

您需要做的只是根據用戶是否已訂閱而改變您的表單集呈現。如果你還在窗體上寫了一個保存方法,它更新調用外部網關來更新數據庫,那麼視圖將保持完全相同。

是否有任何特定的地方你會被擊中?

+0

謝謝你的回答。我的無知主要是阻止我做那個「黑匣子」。我不知道是否有更好的模式來做到這一點,或者如果我需要兩個比一個更好的黑匣子,每個黑匣子都有自己的附加驗證。 – carlosescri 2010-11-19 13:10:05

+0

我終於在沒有知識的情況下使用了這種模式,但它在工作流程中簡化了付款流程。所以答案是好的。謝謝! – carlosescri 2012-05-28 07:43:11