【问题标题】:Django: How to use modal as a form to update an objectDjango:如何使用模态作为表单来更新对象
【发布时间】:2019-06-07 01:55:49
【问题描述】:

我正在尝试使用模态作为编辑表单,但我不知道好方法。

目前我的views.py是这样的。

def edit_entry(request, entry_pk):

    entry = get_object_or_404(Entry, pk=entry_pk)

    if request.method != 'POST':
        form = EntryForm(instance=entry, user=request.user)
    else:
       form = EntryForm(instance=entry, data=request.POST, user=request.user)

        if form.is_valid():
            form.save()

我有这个视图的模板。

我想做的是 从列出一堆条目对象的页面中,当我单击编辑按钮时会显示该对象的编辑表单。

{% for entry in entries %}
    ...
    <button class="btn btn-outline-primary" data-toggle="modal" data-target="#editEntryModal">Edit</button>

    <!-- modal for the object -->

谁能给我提示?

【问题讨论】:

    标签: django django-forms bootstrap-4 bootstrap-modal


    【解决方案1】:

    您需要将表单作为 html 发回,并在显示之前将其粘贴在模态中。所以在点击时,您首先会执行 ajax 请求,这会将您的表单作为 html 发送回。例如,

    def edit_entry(request, entry_pk):
       ....
       entry = get_object_or_404(Entry, pk=entry_pk)
    
       if request.method != 'POST':
           form = EntryForm(instance=entry, user=request.user)
           return HttpResponse(form.as_p())   # This will return the plain html of a form
       ....
    

    希望这会有所帮助!

    【讨论】:

      【解决方案2】:

      您尝试仅使用 django 模板即可。 你需要 js 或 jquery 或任何前端框架。

      当您单击编辑按钮时,当前 dom 中将出现一个编辑来源,您需要进行 ajax 调用以获取用于编辑的初始数据。编辑数据并提交数据vai ajax并在后端更新对象。 django rest 框架更适合这种任务。

      【讨论】:

        【解决方案3】:

        我有一个类似的任务,首先从模板创建了一个 ajax 请求来加载数据:

        <script>
        $(document).ready(function(){
          $("#myBtn").click(function(){
            var pk = $(this).data('pid')
            $("#myModal").modal("show");
          });
          $("#myModal").on('show.bs.modal', function(event){
            var modal = $(this)
            var pk = $(this).data('pid')
            $.ajax({
                data: {'pk': pk},
                url: "{% url 'search:load_paper' %}",
                context: document.body,
                error: function(response, error) {
                    alert(error);
                }
            }).done(function(response) {
                modal.html(response);
            });
          });
        });
        </script>
        

        load_paper 函数如下所示:

        def load_paper(request):
            pk = request.GET.get('pk')
            object = get_object_or_404(Paper, pk = pk)
            form = PaperForm(instance=object)
            return render(request, 'edit_paper_modal.html', {
                'object': object,
                'pk': pk,
                'form': form,
                })
        

        数据在“edit_paper_modal.html”中呈现,如下所示:

        <div class="modal-dialog modal-lg" role="document">
            <form action="{% url 'search:edit_paper' pk=object.pk %}" method="post" class="form" enctype="multipart/form-data">
              {% csrf_token %}
                <div class="modal-content">
                    <div class="modal-header">
                        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                            <span aria-hidden="true">×</span>
                            <span class="sr-only">Close</span>
                        </button>
                        <h4 class="modal-title">Edit Paper</h4>
                    </div>
                    <div class="modal-body">
                      {% csrf_token %}
                      {{form|crispy}}
                      {{ form.media }}
                    </div>
                    <div class="modal-footer">
        
                        <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
                        <input type="submit" class="btn btn-primary" value="Save changes" />
                    </div>
                </div><!-- /.modal-content -->
            </form>
        </div>
        

        这里的关键是我将论文的pk 传递回views.py 中的edit_paper 函数,它实际上保存了表单。 希望这有用!

        【讨论】:

          猜你喜欢
          • 2021-03-05
          • 1970-01-01
          • 1970-01-01
          • 2022-12-12
          • 2022-10-14
          • 1970-01-01
          • 2011-06-08
          • 2016-12-18
          • 1970-01-01
          相关资源
          最近更新 更多