Django:如何使用模式作为形式来更新对象

时间:2019-01-12 09:54:48

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

我正尝试使用模式作为编辑形式,但我不知道好方法。

目前我的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 -->

有人可以给我提示吗?

3 个答案:

答案 0 :(得分:0)

您需要将表单以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
   ....

希望这会有所帮助!

答案 1 :(得分:0)

您尝试仅使用django模板实现的功能。 您需要js或jquery或任何前端框架。

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

答案 2 :(得分:0)

我有一个类似的任务,首先从模板创建了一个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传递回edit_paper中的views.py函数,该函数实际上保存了表单。 希望这是有用的!