【问题标题】:Django form not submitting to databaseDjango表单未提交到数据库
【发布时间】:2021-01-18 10:12:46
【问题描述】:

大家好,我有一个结帐页面,其中包含一些字段和另外两个用于条带身份验证的字段。当我提交我的表单时,它没有被添加到数据库中,而是条带注册付款。我是否需要删除这两个字段才能使用 form(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>

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

【问题讨论】:

  • 能否请您出示您的模板代码
  • 是的,我已经添加了。你知道为什么表单无效吗?
  • 这是你的完整模板吗???表单标签和 csrf 令牌在哪里??
  • 现在可以看到了
  • 请在您提交表单的地方添加view

标签: django django-models django-forms


【解决方案1】:

首先,您需要在 view 中的 form 之后实际 redirect 并创建一个 form例如 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 

【讨论】:

  • 我有不同的视图来显示该表单和不同的提交表单
  • 您应该在问题中提到,在您的表单提交视图中,您必须在提交表单后redirect
  • 是的,但只有一行,名称相同
  • 你试过了吗?
  • 在此之前我正在尝试另一件事,将发布更新
【解决方案2】:

所以我做了 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()


【讨论】:

  • “我不知道为什么,但现在它起作用了”,经典 :D 干杯!
猜你喜欢
  • 2013-06-03
  • 1970-01-01
  • 2018-01-12
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 2015-07-31
  • 2016-05-03
相关资源
最近更新 更多