Django、Vue - 如何从Django传递属性到Vue

3

背景 大家好,我正在尝试使用Django和VUE构建一个“回顾应用程序”。我已经创建了登录界面和仪表板,其中显示了由登录用户创建的“看板”列表。看板是任何人都可以添加和登录不需要的主题表。

问题 当我点击看板时,它会显示数据库中的所有主题。如何将Vue CDN中的'PK'传递到Django DRF中以获取过滤结果。

环境:Django,VUE.js,Django Rest Frame Work

请注意:我对Django和Vue非常陌生,这是我生命中的第一个项目,学习了8个月,请对我友善点。

下面是带有Vue CDN的Board.html。

{% load static %}
{% block content %}
<div id="app">
    <div class="container">
        <form @submit.prevent="submitForm">
            <div class="form-group row">
                <input type="text" class="form-control col-3 mx-2" placeholder="Todo" v-model="retroboard.todo">
                <input type="text" class="form-control col-3 mx-2" placeholder="inprogress"
                    v-model="retroboard.inprogress">
                <input type="text" class="form-control col-3 mx-2" placeholder="Action Items" v-model="retroboard.done">
                <button class="btn btn-success">Submit</button>
            </div>
        </form>
        <!-- <div>
            <form method="POST">
                {% csrf_token %}
                {{form.todo}}
                {{form.inprogress}}
                {{form.done}}
                <button class="btn btn-primary">Add</button>
            </form>
      
        </div> -->
        <table class="table">
            <thead>
                <th>Todo</th>
                <th>InProgress</th>
                <th>Done</th>
            </thead>
            <tbody>
                <tr v-for="board in retroboards" :key="board.id" @dblclick="$data.retroboard = board">
                    <td>[[ board.todo ]]
                        <a href=" "> <i class=" fa fa-heart"></i> </a>
                        <a href=" "> <i class="fa fa-trash"></i> </a>
                    </td>
                    <td>[[ board.inprogress ]]</td>
                    <td>[[ board.done ]]</td>
                    <td> <button class="btn btn-outline-danger btn-sm mx-1" @click="deleteTopic(board)">x</button>
                    </td>
                </tr>
            </tbody>
        </table>
    </div>
</div>
<!-- Vue.js -->
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/axios/0.19.2/axios.js"></script>

<script>
    var app = new Vue({
        el: '#app',
        delimiters: ['[[', ']]'],
        data() {
            return {
                retroboard: {
                    "todo": '',
                    "inprogress": '',
                    "done": '',
                    "id": ''
                },
                retroboards: [],
            }
        },
        async created() {
            await this.getRetroTopics();
        },
        methods: {

            submitForm() {
                if (this.retroboard.id === undefined) {
                    this.createRetroTopic();
                } else {
                    this.editRetroTopic();
                }
            },
            async getRetroTopics() {
                var response = await fetch("http://127.0.0.1:8000/api/retroboard/");
                this.retroboards = await response.json();
            },
            async createRetroTopic() {
                await this.getRetroTopics()
                await fetch("http://127.0.0.1:8000/api/retroboard/", {
                    method: 'POST',
                    headers: {
                        'Content-Type': 'application/json',
                        'X-CSRFToken': csrftoken,
                    },
                    body: JSON.stringify(this.retroboard)
                });
                // this.retroboards.push(await response.json());
                await this.getRetroTopics();
                this.retroboard = {};
            },

            async editRetroTopic() {
                await this.getRetroTopics()
                await fetch(`http://127.0.0.1:8000/api/retroboard/${this.retroboard.id}/`
                    , {
                        method: 'PUT',
                        headers: {
                            'Content-Type': 'application/json',
                            'X-CSRFToken': csrftoken,
                        },
                        body: JSON.stringify(this.retroboard)
                    });
                await this.getRetroTopics();
                this.retroboard = {};
            },

            async deleteTopic(retroboard) {
                await this.getRetroTopics()
                await fetch(`http://127.0.0.1:8000/api/retroboard/${retroboard.id}/`
                    , {
                        method: 'delete',
                        headers: {
                            'Content-Type': 'application/json',
                            'X-CSRFToken': csrftoken,
                        },
                        body: JSON.stringify(this.retroboard)
                    });
                await this.getRetroTopics();
            }

        }

    })
</script>

{% endblock %}```
1个回答

1

有点晚了,但我建议您使用带有props的插槽。大多数情况下,这是将Django变量传递到Vue的最佳方式。

例如:

index.js

let myComponent = {
    data    : function() {
        return {
            in_message : "Hello World !",
        }
    },
    props   : {
        p_url   : String,
        p_pk    : Number,
    },
    methods     : {},
    template    : " \
        <div alt='Slot must be surround'> \
            <slot \
                :out_message='in_message' \
            ></slot> \
        </div> \
    ",
}

var app = new Vue({
    delimiters  : ['[[', ']]'],
    el          : '#app',
    components  : {
        myComponent
    },
})

index.html

<html>
    <head>
        <title>Django | VueJS {% trans " are working together "%}</title>
    </head>
    <body>
        {% with message="Django" url="/" pk=1 %}
            <my-component
                p_url='{{ url }}'
                p_pk='{{ pk}}'
            >
                <template v-slot:default='my_slot_name'>
                    <p>{{message}} | [[ my_slot_name.out_message ]] </p>
                </template>
            </my-component>
        {% endwith %}
    </body>
</html>

还有许多与Vue.js和Django结合使用的技巧,可以使它们更好地协同工作。如果需要,请给我发消息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接