Skip to main content
 首页 » 编程设计

python之使用 Django 模型的促销代码

2025年05月04日41rubylouvre

我有一个 Django 1.3.3 应用程序。我被要求为其添加“促销代码”类型的功能。基本上当用户注册这个产品时(注意:不是在用户注册系统时),他们可以输入促销代码(如果他们有),它会给他们一个免费天数。

在收到此要求之前,我将该产品的注册页面作为一个简单的 ModelForm。我对模型进行了必要的更改,并将“成员(member)”模型中的外键字段添加到新的促销模型中。

  • id(整数)
  • 促销代码 models.CharField(max_length=20)
  • number_of_days = models.IntegerField()

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

当它添加到表单时,它会给我一个包含所有促销代码的下拉框。但是,那不是我想要的。我希望他们必须拥有代码并将其输入文本框中。然后作为表单验证的一部分,查看它是否是有效代码。请记住,他们可能根本没有代码(因此,我不希望他们只是从列表中进行选择)。

使用 Django ModelForm 实现此类要求的最佳方法是什么?

注意:我知道我可以备份并拥有一个完全自定义的表单,但我的页面已经在使用 ModelForm,只需添加此功能即可。

请您参考如下方法:

我将从表单中排除成员模型上的外键字段。

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

将额外的输入元素添加到促销代码的模板中。然后在您的 View 中进行一些自定义处理 -

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

如果您使用通用 View 类进行表单编辑,则重写 form_valid() 方法以添加促销代码(使用上述模式)。您将能够使用 self.request.POST 访问发布数据。