Django表单未提交到数据库

时间:2021-01-18 10:12:46

标签: django django-models django-forms

大家好,我的结帐页面有一些字段和另外两个用于条带身份验证的字段。当我提交我的表单时,它没有被添加到数据库中,而是条纹注册付款。我是否需要删除这两个字段才能使用表单(request.POST) 我的模型

class ShippingAddress(models.Model):
    customer      = models.ForeignKey(Customer, on_delete=models.SET_NULL, blank=True, null=True)
    order         = models.ForeignKey(Order, on_delete=models.SET_NULL, blank=True, null=True)
    recipient     = models.TextField(max_length=50, null=True)
    city          = models.TextField(max_length=50, null=True)
    country       = models.TextField(max_length=50, null=True)
    zip_code      = models.TextField(max_length=15, null=True)
    phone         = models.TextField(max_length=10, null=True)
    email         = models.EmailField(max_length=30, null=True)
    adress        = models.TextField(max_length=100, null=True)
    transaction_id= models.TextField(max_length=100,null=True)
    invoice       = models.BooleanField(default=False, blank=True, null=True)
    invoiceRecipient   = models.TextField(max_length=50, null=True, blank=True)
    invoiceAdress = models.TextField(max_length=50, null=True, blank=True)
    invoiceZip    = models.TextField(max_length=15, null=True, blank=True)
    invoiceCity   = models.TextField(max_length=50, null=True, blank=True)
    invoiceNip    = models.TextField(max_length=15, null=True, blank=True)
    processed     = models.BooleanField(default=False, blank=True, null=True)
    date_added    = models.DateTimeField(auto_now_add=True)
    
    def __str__(self):
        return str(self.adress)

forms.py

class CustomerShipp(ModelForm):
    invoice = forms.BooleanField(widget=forms.CheckboxInput(attrs={'class':'checkboxInvoice',}),required=False)
    class Meta:
        model   = ShippingAddress
        fields  = [ 'city', 'country','zip_code','adress',
                    'phone','email','recipient','invoice','invoiceRecipient',
                    'invoiceAdress','invoiceZip','invoiceCity','invoiceNip','transaction_id','customer','order']
        exclude =['processed', 'date_added']

        widgets ={
          'city'            :forms.TextInput(attrs={'class':'shippForm'}),
          'country'         :forms.TextInput(attrs={'class':'shippForm'}),
          'zip_code'        :forms.TextInput(attrs={'class':'shippForm'}),
          'adress'          :forms.TextInput(attrs={'class':'shippForm'}),
          'email'           :forms.TextInput(attrs={'class':'shippForm'}),
          'recipient'       :forms.TextInput(attrs={'class':'shippForm'}),
          'phone'           :forms.TextInput(attrs={'class':'shippForm'}),
          'invoiceRecipient':forms.TextInput(attrs={'class':'shippForm'}),
          'invoiceAdress'   :forms.TextInput(attrs={'class':'shippForm'}),
          'invoiceZip'      :forms.TextInput(attrs={'class':'shippForm'}),
          'invoiceCity'     :forms.TextInput(attrs={'class':'shippForm'}),
          'invoiceNip'      :forms.TextInput(attrs={'class':'shippForm'}),
          'transaction_id'  :forms.TextInput(attrs={'type':'hidden'}),
          'customer'        :forms.TextInput(attrs={'type':'hidden'}),
          'order'           :forms.TextInput(attrs={'type':'hidden'}),
       }

我的观点

from .forms import *
def processOrder(request):
    if request.method == "POST" and request.user.is_authenticated:
         order, created = Order.objects.get_or_create(customer=customer, complete=False)
         order.complete = True
         order.transaction_id = transaction_id
         order.save()

         transaction_id = datetime.datetime.now().timestamp()
         customerOnWebsite = request.user.customer
         forms = CustomerShipp(request.POST)
         print(request.POST)
         print(forms.is_valid())
         if forms.is_valid():
           adding = forms.save(commit=False)
           adding.customer = customerOnWebsite
           adding.order    = order
           adding.transaction_id = transaction_id
           adding.save()
    
      return render(request,'policy.html')

查询字典

模板

<form action="{% url 'processOrder'  %}" method="post" id="payment-form">
    {% csrf_token  %}
<div class="recipientAdressWrapper">
   <div class="form-group">
        {{ forms.recipient  }}
   </div>
   <div class="form-group">
     {{ forms.adress  }}
   </div>
   <div class="form-group">
      {{ forms.zip_code  }}
   </div>
   <div class="form-group">
      {{ forms.city  }}
   </div>
   <div class="form-group">
       {{ forms.country }}
   </div>
   <div class="form-group">
       {{ forms.email }}
   </div> 
   <div class="form-group">
    {{ forms.phone }}
   </div> 
   <div class="invoiceWrapper">
     <div class="invoiceToggle">
       {{ forms.invoice }}
      </div>
     <div class="invoiceFromWrapper">
        <div class="form-group">
          {{ forms.invoiceRecipient }}
        </div>
      <div class="form-group">
         {{ forms.invoiceAdress }}
      </div>
      <div class="form-group">
        {{ forms.invoiceZip }}
       </div>
      <div class="form-group">
        {{ forms.invoiceCity }}
      </div>
       <div class="form-group">
        {{ forms.invoiceNip }}
       </div>
     </div>
    </div>   
   </div>
<div class="widthBtnCheckout">
<button type="submit" href="" class="btn btn-sm animated-button thar-three">{% trans "Zakończ i zapłać" %}</button></div>
</form>

最后两个以支付开头的字段是通过 stripe.js 添加的

2 个答案:

答案 0 :(得分:0)

首先,您需要在视图中在表单之后实际重定向,并创建一个表单实例如果 GET 请求并通过字典将其发送到模板:

from .forms import *


def processOrder(request):
    if request.method == "POST" and request.user.is_authenticated:
         order, created = Order.objects.get_or_create(customer=customer, complete=False)
         order.complete = True
         order.transaction_id = transaction_id
         order.save()

         transaction_id = datetime.datetime.now().timestamp()
         customerOnWebsite = request.user.customer
         forms = CustomerShipp(request.POST)
         print(request.POST)
         print(forms.is_valid())
         if form.is_valid():
           adding = forms.save(commit=False)
           adding.customer = customerOnWebsite
           adding.order    = order
           adding.transaction_id = transaction_id
           adding.save()
           return redirect('home') # or somewhere else
      else:
          fors = CustomerShipp() # define a form in a GET request for display
      return render(request,'policy.html', {'form': form}) # render the form as well 

答案 1 :(得分:-1)

所以我做了 request.post 的浅拷贝,然后从通过 stripe.js 身份验证生成的所述拷贝字段中弹出,并且我在表单 is_valid 之前移动了添加事务。我不知道为什么,但现在可以了

customerOnWebsite = request.user.customer
values = request.POST.copy()
values['transaction_id'] = transaction_id
values.pop('payment_method_id')
values.pop('payment_intent_id')
print(values)
forms = CustomerShipp(values)
print(forms.is_valid())
if forms.is_valid():
   adding = forms.save(commit=False)
   adding.customer = customerOnWebsite
   adding.order    = order
            adding.save()


相关问题