向django表单添加新字段

时间:2014-02-12 18:59:34

标签: django django-models django-forms django-views

我是Django的新手,我第一次尝试使用django表格。我已经搜索了这个,但我还没有找到答案。基本上我有这样的观点:

def pay(request):    
if request.method == 'POST':
    form = PaymentForm(request.POST)
    if form.is_valid():
        # I have to calculate the checksum here
        myModel = form.save()
    else:
        print form.errors
else: # The request is GET  
    form = PaymentForm()
return render_to_response('payment/payment.html', {'form':form})

我希望从表单中输入的表单中添加一个额外的字段,校验和。因此,当用户提交条目时,应添加校验和并将其添加到表单中,并将表单发送到外部服务器。但我不知道该怎么做(我在模型中定义了校验和)。有谁可以帮我这个?

我的模型看起来像这样:

class PaymentModel(models.Model):
alphanumeric = RegexValidator(r'^[0-9a-zA-Z]*$', 'Only alphanumeric characters are allowed!')
secret_key = '6cd118b1432bf22942d93d784cd17084'
pid = models.CharField(primary_key=True, max_length=50, validators=[alphanumeric])
sid = models.CharField(primary_key=True, max_length=50, validators=[alphanumeric])
amount = models.DecimalField(max_digits=9, decimal_places=2)
success_url = 'http://localhost:8000/success'
cancel_url = 'http://localhost:8000/cancel'
error_url = 'http://localhost:8000/error'
checksum = 0

def calc_checksum(self):
    checksumstr = "pid=%s&sid=%s&amount=%s&token=%s"% (self.pid, self.sid, self.amount, self.secret_key)
    m = md5(checksumstr)
    checksum = m.hexdigest() 
    return checksum

def __unicode__(self): #returns the unicode representation of the object
    return self.name

我的表单如下:

class PaymentForm(ModelForm):
    class Meta:
        model = PaymentModel

1 个答案:

答案 0 :(得分:0)

您可以将commit=False关键字参数用于form.save()

def pay(request):    
    if request.method == 'POST':
        form = PaymentForm(request.POST)
        if form.is_valid():
            # Will not save it to the database
            myModel = form.save(commit=False)

            # keep your business logic out of the view and put it on the form or model
            # so it can be reused
            myModel.checksum = form.calculate_checksum()
            myModel.save()
        else:
            print form.errors
    else: # The request is GET  
        form = PaymentForm()

    return render_to_response('payment/payment.html', {'form':form})

Django form.save() documentation.