【问题标题】:Django model form mutiple selector can not save inti DBDjango模型表单多个选择器无法保存到数据库中
【发布时间】:2020-01-20 14:20:51
【问题描述】:

我有一个问题如下。我在这个问题上停留了一段时间。

我在 django 模型表单中建立了一个订单,该订单提供客户使用购物车来填写他们的交易信息。

下面是我的代码结构:

## models.py
from django.db import models

class Order(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    email = models.EmailField()
    address = models.CharField(max_length=250)
    postal_code = models.CharField(max_length=20)
    city = models.CharField(max_length=10)
## forms.py
from django import forms
from .models import Order
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Layout,Div,Field
class OrderCreateForm(forms.ModelForm):
    class Meta:
        model = Order
        fields = ['first_name', 'last_name', 'email', 'address', 'postal_code','city']
    def __init__(self,*args,**kwargs):
        super(OrderCreateForm, self).__init__(*args, **kwargs)
        self.helper = FormHelper()
        self.helper = Layout(
            Div(Field('city') , id="twzipcode_ADV"),
        )
## views.py

from .forms import OrderCreateForm
from .models import OrderItem

def order_create(request):
    cart = Cart(request)
    if request.method == 'POST':
        form = OrderCreateForm(request.POST)
        if form.is_valid():
            order = form.save()
## .html
    <form action="." method="post">
        {% csrf_token %}
        {% for field in form %}
            {% if field is form.city or field is form.county%}
              <div id="twzipcode_ADV"></div>
            {% else %}
              {{field.name}}
              {{field}}
            {% endif %}
        {% endfor %}
        {% buttons %}
            <button type="submit" class="btn btn-success btn-product">
                <span class="glyphicon glyphicon-shopping-cart"></span> Place order
            </button>
        {% endbuttons %}
    </form>
 <script src='https://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js'></script>
 <script src='https://cdn.jsdelivr.net/npm/jquery-twzipcode@1.7.14/jquery.twzipcode.min.js'></script>
 <script src="{%static "js/orders/create.js" %}"></script>
## create.js
$("#twzipcode_ADV").twzipcode({
zipcodeIntoDistrict: true, 
css: ["city form-control", "town form-control"], 
countyName: "city", 
districtName: "town" 
});

网站可以如下图所示。 正如我在红色矩形区域中显示的那样。我的问题是当我按下占位符按钮时,第二个选择器不会保存到我已经在 models.py 中定义的城市字段中。但是它只存储第一个选择器。我该如何解决这个问题?

【问题讨论】:

  • 图在这里:
  • 您的结帐表单显示了两个带有数据选项的选择器。您是如何做到的?但是您的模型在“邮政编码”之后仅显示“城市”。它显示了一个字段,但在您的图中它显示了两个字段。你到底想要什么?
  • 我使用上面封装在 Jason 表单中的 JavaScript API 来实现一个 div 标签中的两个选择器,您可以在 js 文件中看到。更多详细信息您可以参考上面的 URL。我想要他们两个但是我只能提取第一个。

标签: javascript python django django-forms


【解决方案1】:

如果您需要添加作为表单值动态出现的额外字段值,那么您可以在views.py中添加它:

from .forms import OrderCreateForm
from .models import OrderItem

def order_create(request):
    cart = Cart(request)
    if request.method == 'POST':
        form = OrderCreateForm(request.POST)
        if form.is_valid():
            country = form.cleaned_data.get("country")
            order = form.save(commit=False)
            order.country = country
            order.save()

您的模型必须在字段列表中包含此字段。并且需要进行迁移。否则字段值将不会被保存,而是会触发错误。

【讨论】:

    猜你喜欢
    • 2021-06-28
    • 1970-01-01
    • 2020-06-17
    • 1970-01-01
    • 2021-05-03
    • 2020-02-29
    • 1970-01-01
    • 1970-01-01
    • 2018-11-23
    相关资源
    最近更新 更多