如何在 Django 布尔字段上应用条件?

How to apply condition on django boolean field?

我正在从事一个多供应商 Django 基础电子商务项目。我想实现一个单选按钮基本选择,比如当用户将商品添加到购物车时,我希望 him/her 选择(是或否)。这是礼物吗?当用户单击“是”时,我需要显示一个消息输入字段,其中 he/she 可以将自定义消息打印在项目上。购物车中有多个项目。谁能指导我如何在 Django 中执行此操作?提前谢谢你。

更新 : 我已经解决了 javascript 问题,但表单未在视图 post 方法中提交。结帐按钮在点击时不执行任何操作。

function hideShowGiftField(btnId, msgFieldId) {
            let btn = document.getElementById(btnId)
            let msgField = document.getElementById(msgFieldId)
            if (btn.value === 'yes') {
                msgField.type = 'text'
            } else if (btn.value === 'no') {
                msgField.type = 'hidden'
            }
        }

        function hideShowEngravingField(btnId, engravingFieldId) {
            let btn = document.getElementById(btnId)
            let engravingField = document.getElementById(engravingFieldId)
            if (btn.value === 'yes') {
                engravingField.type = 'text'
            } else if (btn.value === 'no') {
                engravingField.type = 'hidden'
            }
        }
<form action="{% url 'cart_detail' %}" method="post">
{% csrf_token %}
<section>
    <div class="container">
        <div class="">
            <h2 class="review-cart-desktop">Review Cart</h2>
            <hr>
            <h2 class="review-cart">Review Cart</h2>
            <div class="row d-flex justify-content-center">
                <div class="col-8">
                    <h4 class="mx-2 font-weight-bold">Item</h4>
                </div>
                <div class="col-4">
                    <div class="row text-center header-names">
                        <div class="col-md-6">
                            <h6 class="mt-2 text-center font-weight-bold">Quantity</h6>
                        </div>
                        <div class="col-md-6">
                            <h6 class="mt-2 text-center font-weight-bold">Price</h6>
                        </div>
                    </div>
                </div>
            </div>
            <hr>
            {% for item in cart_items %}
                <div class="row d-flex justify-content-center">
                    <div class="col-8 col-xs-12">
                        <div class="row d-flex">
                            <div class="book"><img src="{{ item.variant.first.product.main_image.url }}"
                                                   alt="{{ item.variant.first.product.name }}"
                                                   class="book-img">
                            </div>
                            <div class="my-auto flex-column d-flex pad-left">
                                <h6 class="mob-text-item"
                                    style="text-transform: capitalize">{{ item.variant.first.product.name }}</h6>
                                {% for variant in item.variant.all %}
                                    <p class="mob-text">{{ variant|capfirst }}</p>
                                {% endfor %}
                                {#                                            <p class="mob-text mob-text-custom"><a href="">View Custom Design</a></p>#}
                            </div>
                        </div>
                        <div class="col-8 complete-row-input" style="margin-left: 150px;">
                            <div class="row">
                                <div class="col-8">
                                    <p style="font-size: 20px;">Is This is A Gift?</p>
                                </div>
                                <div class="col-4">
                                    <div class="d-flex" style="margin-left:15px ;">
                                        <label for="gift_yes_{{ item.id }}">Yes</label><input type="radio"
                                                                                              id="gift_yes_{{ item.id }}"
                                                                                              onchange="hideShowGiftField(this.id, 'custom-message-{{ item.id }}')"
                                                                                              name="{{ item.variant.first.product.name }}_gift"
                                                                                              value="yes"
                                                                                              class="mt-1 radio-size"
                                                                                              style="width: 30px;">
                                        <label for="gift_no_{{ item.id }}">No</label><input type="radio"
                                                                                            id="gift_no_{{ item.id }}"
                                                                                            onchange="hideShowGiftField(this.id, 'custom-message-{{ item.id }}')"
                                                                                            name="{{ item.variant.first.product.name }}_gift"
                                                                                            value="no"
                                                                                            class="mt-1 radio-size"
                                                                                            style="width: 30px;">
                                    </div>
                                </div>
                            </div>
                            <input type="hidden" id="custom-message-{{ item.id }}" class="placeholder"
                                   placeholder="Custom Message"
                                   name="custom_message_for_{{ item.id }}"
                                   style="width: 100%;"/>
                            <div class="row mt-3">
                                <div class="col-8">

                                    <p style="font-size: 20px;">Need Engraving?</p>
                                </div>
                                <div class="col-4">
                                    <div class="d-flex" style="margin-left:15px ;">
                                        <label for="engraving-yes">Yes</label><input type="radio"
                                                                                     id="engraving_yes_{{ item.id }}"
                                                                                     onchange="hideShowEngravingField(this.id, 'engraving-message-{{ item.id }}')"
                                                                                     name="{{ item.variant.first.product.name }}_engraving"
                                                                                     value="yes"
                                                                                     class="mt-1 radio-size"
                                                                                     style="width: 30px;">
                                        <label for="engraving-no">No</label><input type="radio"
                                                                                   id="engraving_no{{ item.id }}"
                                                                                   onchange="hideShowEngravingField(this.id, 'engraving-message-{{ item.id }}')"
                                                                                   name="{{ item.variant.first.product.name }}_engraving"
                                                                                   value="no"
                                                                                   class="mt-1 radio-size"
                                                                                   style="width: 30px;">
                                    </div>
                                </div>
                            </div>
                            <input type="hidden" id="engraving-message-{{ item.id }}" class="placeholder"
                                   placeholder="Engraving Message"
                                   name="engraving_message_for_{{ item.id }}"
                                   style="width: 100%;"/>
                        </div>
                    </div>
                    <!-- </td> -->
                    <div class="col-4">
                        <div class="row text-right">
                            <div class="col-md-6 col-sm-12 mt-5">
                                <!-- <td> -->
                                <div class="row d-flex justify-content-center counting">
                                    <p class="mb-2 mx-3 font-weight-bold" id="cnt1">{{ item.quantity }}</p>
                                    <div class="d-flex flex-column plus-minus">
                                        <form action="" method="post">
                                            {% csrf_token %}
                                            <button onclick="increment('{% url 'item_increment' item.id %}')"
                                                    class="vsm-text plus">
                                                +
                                            </button>
                                        </form>
                                        <form action="" method="post">
                                            {% csrf_token %}
                                            <button onclick="increment('{% url 'item_decrement' item.id %}')"
                                                    class="vsm-text minus">
                                                -
                                            </button>
                                        </form>
                                    </div>
                                </div>
                                <div class="button-remove" align="center">
                                    <a href="{% url 'delete-cart-item' item.id %}" type="button"
                                       class="btn btn-danger remove-button mt-2">Remove
                                    </a>
                                </div>
                            </div>
                            <div class="col-md-6 mt-2" align="center">
                                <h6 class="mob-text-price">Rs {{ item.get_subtotal }}</h6>
                            </div>
                        </div>
                    </div>
                </div>
                <hr>
            {% endfor %}
        </div>
    </div>
    <div class="container">
        <div class="row total-price-desktop">
            <div class="col-md-12">
                <div class="text-right total-price">Total : {{ total }}</div>
            </div>
        </div>
    </div>
    <div class="row total-price-mobile">
        <div class="col-sm-12">
            <div class="row">
                <div class="col-6">
                    <div class="total" align="left">Total</div>
                </div>
                <div class="col-6">
                    <div class="price" align="right">Rs :{{ total }}</div>
                </div>
            </div>
        </div>
    </div>
</section>
<hr>
<section>
    <div class="container-fluid">
        <div class="row mt-3">
            <div class="col-4 offset-4">
                <div class="row d-flex justify-content-center">
                    {#                                <input type="submit" value="Checkout">#}
                    <button type="submit" class="btn btn-info" style="width: 50%">Checkout</button>
                </div>
            </div>
            <div class="text-checkout-bottom col-2 offset-2">
                <div style="float: right;">
                    <p><small>*Shipping Calculated on Next Step</small></p>
                    <p style="margin-top: -20px;"><small>*Select gift wrapping on Next Step</small>
                    </p>
                </div>
            </div>
        </div>
    </div>
</section>
</form>

您可以通过 Javascript 完成此操作。您应该搜索如何在浏览器上操作 html 元素。当用户单击是按钮时,您应该在浏览器上创建 input html 元素。 Javascipt 只是在浏览器上操作 html 标签的一种方式。 我建议您查看 DOM 操作:https://www.w3schools.com/jsref/dom_obj_text.asp

您还应该在您的产品或订单上添加消息字段 table。它应该可以为空 (Null=True),然后如果客户添加消息,您可以将此消息存储在消息字段中。