2013-02-27 99 views
2

我有一個Django 1.3.3應用程序。我被要求爲其添加「促銷代碼」類型的功能。基本上當用戶註冊這個產品(注意:不是在系統的用戶註冊時),他們可以輸入一個促銷代碼(如果他們有一個),它會給他們幾天的免費。促銷代碼與Django模型

在給出這個要求之前,我把這個產品的註冊頁作爲一個簡單的ModelForm。我已經對模型進行了必要的更改,並且已將「成員」模型的外鍵字段添加到新的促銷模型中。

  • ID(整數)
  • promo_code models.CharField(MAX_LENGTH = 20)
  • NUMBER_OF_DAYS = models.IntegerField()

    def __unicode__(self): 
        return u'{}'.format(self.promo_code) 
    

當將其添加到形式,它給了我一個包含所有促銷代碼的下拉框。但是,那不是我想要的。我希望他們必須擁有代碼並將其輸入到文本框中。然後作爲表單驗證的一部分,看看它是否是有效的代碼。記住,他們可能根本沒有代碼(所以我不希望他們只是從列表中選擇)。

用Django ModelForm實現這種需求的最佳方式是什麼?

注意:我知道我可以備份並擁有完全自定義的表單,但我已經使用ModelForm工作,並且只需要添加此功能。

+0

如果錯誤,請糾正我,如何製作促銷代碼主鍵和使用促銷代碼字段的自定義文本框小部件。 – nims 2013-02-27 18:35:51

+0

@nims我喜歡這個想法。它會導致數據庫中出現一些膨脹(成員表中的int vs varchar),但它不需要兩個字段以及promo_code上的唯一索引。 – 2013-02-27 21:31:35

+0

@nims我實施了您推薦的解決方案。如果你將它寫成答案,我會給你信用的。 – 2013-02-28 01:38:48

回答

0

我會從Form中排除成員模型中的外鍵字段。

class MemberForm(ModelForm): 
    class Meta: 
     model = Member 
     exclude = ('promo',) 

將額外的輸入元素添加到您的促銷代碼的模板中。然後做一些定製加工的在您的視圖 -

def sign_up(request): 
    #... 
    if request.method == 'POST': 
     form = MemberForm(request.POST) 
     if form.valid(): 
      obj = form.save() 
      if 'promo_field' in request.POST: 
       try: 
        obj.promo = Promotion.objects.get(pk=request.POST['promo_field']) 
        obj.save() 
       except DoesNotExist: 
        pass # the code wasn't valid 
    else: 
     #... 

如果您在使用通用視圖類的表單編輯,然後重寫form_valid()方法添加促銷代碼(與上面的圖案)。您將可以使用self.request.POST訪問發佈數據。