как реализовать vue.js и django - PullRequest
6 голосов
/ 11 июня 2019

Это одностраничное приложение с vue.js, которое выполняет несколько простых вычислений, и я пытаюсь реализовать это вычисление в django, но оно не дает мне желаемого результата. Этот код vue.js работал идеально до реализации в Джанго. Здесь я сделал массив в динамическом vue.js, а также он показывает мне только изображение продукта идеально, но не product.name и product.sell_price, а также @click.prevent="addToCart(product)" эта функция ничего не делает ?? Как я могу решить это?

vue.js

   <script src="{% static 'js/vue.js' %}"></script>

   <script type="text/javascript" src="{% static '/js/vue-resource.js' %}"></script>
    <script>

 new Vue({
    el: '#posApp',

    data: {
        total: 0,
        discount: 0,
        products: [
            {% for product in products %}
                {
                    "id": {{product.id}},
                    "name": "{{product.name}}",
                    "image": "/media/{{product.image}}",
                    "price": {{product.sell_price}}
                },
              {% endfor %}

        ],
        cart: [],
        search: ""
    },
    methods: {

        addToCart: function(product){

            var found = false;
            for (var i = 0; i < this.cart.length; i++){
                if (this.cart[i].id === product.id){
                    this.cart[i].quantity++;
                    found = true;
                }
            }
            if (!found) {
                this.cart.push({
                    id: product.id,
                    name: product.name,
                    sell_price: product.sell_price,
                    quantity: 1
                });
            }

            this.total += product.sell_price;
        },
        inc: function(item){
            item.quantity++;
            this.total += item.sell_price;
        },
        dec: function(item){
            item.quantity--;
            this.total -= item.sell_price;
            if (item.quantity <= 0){
                var i = this.cart.indexOf(item);
                this.cart.splice(i, 1);
            }
        },
        removeFromCart: function(item){
            this.cart.splice(this.cart.indexOf(item), 1);
            this.total = this.total - (item.sell_price * item.quantity);
        },
        clearCart: function(){
            this.cart = [];
            this.total = 0;
            this.discount = 0;
        },
        payment: function(){
            this.cart = [];
            this.total = 0;
            this.discount = 0;
            alert('Transaction Completed');
        }
    },
    computed: {
        filteredProducts(){
            // var lowerTitle = product.title.toLowerCase();
            return this.products.filter((product) => {
                return product.name.toLowerCase().match(this.search);
            });
        }
    }
});
</script>

HTML

 <div class="col-md-3" v-for="product in filteredProducts" :key="product.id"> <!-- Inner-Col .// -->
                  <a href="#" @click.prevent="addToCart(product)">
                    <div class="box box-default pos-product-card"> <!-- /.box -->
                      <img class="card-img-top img-responsive" :src="product.image" alt="Card image cap">
                      <div class="box-body"> <!-- /.box-body -->
                        <h4 class="box-title">{{ product.name }}</h4>
                        <!-- <p class="box-text">Some quick example text to build on the card title and make up the bulk of the card's content.</p> -->
                        <button class="btn btn-info"><i class="fas fa-shopping-cart"></i></button>
                      </div> <!-- /.box-body -->
                    </div> <!-- /.box -->
                  </a>
                </div>
{% for category in categories %}
            <div class="tab-pane fade" id="category-{{category.id}}">

                <div class="row"> <!-- Inner-Row .// -->
                    {% for product in category.product_set.all %}
                   <div class="col-md-3" v-for="product in filteredProducts" :key="product.id"> <!-- Inner-Col .// -->
                  <a href="#" @click.prevent="addToCart(product)">
                    <div class="box box-default pos-product-card"> <!-- /.box -->
                      <img class="card-img-top img-responsive" :src="product.image" alt="Card image cap">
                      <div class="box-body"> <!-- /.box-body -->
                        <h4 class="box-title">{{ product.name }}</h4>
                        <!-- <p class="box-text">Some quick example text to build on the card title and make up the bulk of the card's content.</p> -->
                        <button class="btn btn-info"><i class="fas fa-shopping-cart"></i></button>
                      </div> <!-- /.box-body -->
                    </div> <!-- /.box -->
                  </a>
                </div>
                    {% endfor %}
     <table class="table table-hover text-center">
                                  <!-- <thead class="thead-dark"> -->
                                    <tr>
                                      <th>Item</th>
                                      <th>Quantity</th>
                                      <th>Rate</th>
                                      <th>Subtotal</th>
                                      <th>&nbsp;</th>
                                    </tr>
                                  <!-- </thead> -->
                                      <tr v-for="item in cart" :key="{{item.id}}">

                    <td><a href="#">{{ item.name }}</a></td>
                    <td><button class="btn btn-flat btn-xs btn-info p-1 mx-1" @click="inc(item.id)">+</button>[[ item.quantity ]]<button class="btn btn-flat p-1 mx-1 btn-xs btn-info" @click="dec(item.id)">-</button></td>
                    <td><span class="text-muted">{{ item.sell_price }}</span> </td>
                    <td>Rs {{ item.sell_price * item.quantity }}</td>
                    <td><button class="btn btn-xs btn-outline-primary" @click="removeFromCart(item)"><i class="fas fa-trash-alt"></i></button></td>
                  </tr>
                                  </table>
                                </div>
                                <div class="no-item-msg" v-if="cart.length === 0">No items in the cart.</div>
                              </div>
         <table class="table">
                                    <tr>
                      <td>Total Items</td>
                      <td>{{ cart.length }}</td>
                    </tr>
                    <tr>
                      <td>Total Amount</td>
                      <td>{{ total }}</td>
                    </tr>
                    <tr>
                      <td><span class="height-control">Discount (In Amount)</span></td>
                      <td><input type="number" v-model="discount" class="form-control"></td>
                    </tr>
                    <tr class="bg-dark">
                      <td>TO PAY</td>
                      <td>{{ total-discount }}</td>
                    </tr>

1 Ответ

5 голосов
/ 13 июня 2019

Вам нужно учесть несколько моментов:

  1. Похоже, у вас есть синтаксическая коллизия в html, потому что Django и Vue.js используют одинаковые {{ и }} дляпоставить переменную.Но, поскольку Django будет обрабатывать ваш html до Vue, он заменит

    <h4 class="box-title">{{ product.name }}</h4>

    тем, что он найдет в контексте (контекст Django tepmlate на стороне сервера),Вы можете проверить источник или свою страницу в браузере, и, вероятно, вы увидите в этой строке:

    <h4 class="box-title"></h4>

    Поскольку он не найдет переменную python product (и вы на самом деле имели в виду js(vue) переменная).

    Решение : использовать другие разделители Vue.См. https://vuejs.org/v2/api/#delimiters. Например, используйте [[ вместо {{ в Vue: параметр для вашего экземпляра Vue delimiters: ['[[', ']]'], и измените эту строку (и другую, где вы имеете в виду переменные Vue) на

    <h4 class="box-title">[[ product.name ]]</h4>

  2. В данных Vue у вас есть не переменная product.sell_price, как при выполнении

  {% for product in products %}
     {
      "id": {{product.id}},
      "name": "{{product.name}}",
      "image": "/media/{{product.image}}",
      "price": {{product.sell_price}}
      },
  {% endfor %}

у вас будет product.price, а не product.sell_price в Vue.Или вы должны изменить строку выше на "sell_price": {{product.sell_price}}

Скоро вы столкнетесь с проблемами с переменной item.Так как у вас item в контексте django, а не в данных Vue.Вы должны добавлять элементы в данные Vue, как вы это делали для products.

В общем, рассмотрите изменение вашего подхода от смешивания шаблона django и кода Vue к:

  • Django доставляет данные в Vue
  • Vue генерирует все html и выполняет ваши js-функции

ИЛИ

  • использует каркас Django Rest (https://www.django -rest-framework.org / ) для предоставления API покоя
  • и использования Vue только во внешнем интерфейсе, загрузки данных с сервера и внесения изменений на сервер с помощью вызовов REST (например, с помощью axios)

Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...