我有一个 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 访问发布数据。
