2

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

在得到这个要求之前,我有这个产品的注册页面作为一个简单的 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,并且只需要添加此功能。

4

1 回答 1

0

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

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

于 2013-02-27T19:36:25.963 回答