Django urlpatterns-NoReverseMatch at ...反向为'',未找到参数

时间:2019-06-20 18:14:13

标签: django django-templates django-views

我正在Django中构建模式窗体,该窗体允许用户编辑现有记录的详细信息。具体来说,在paper_detail.html中,有一个用户可以单击的按钮,该按钮随后将通过ajax以模式形式加载特定的纸张。

将纸张装入模态表单后,用户可以对其进行编辑。

我去http://127.0.0.1:8000/paper/796134/时遇到以下错误:

NoReverseMatch at /paper/796134/
Reverse for 'edit_paper' with no arguments not found. 1 pattern(s) tried: ['search/edit/(?P<pk>\\d+)/$']

这对我来说非常令人困惑,因为我希望它会转到paper_detail

urls.py

urlpatterns = [
     path('paper/<int:pk>/', views.paper_detail, name='paper_detail'),
     url('', views.load_paper, name='load_paper'),
     url(r'^edit/(?P<pk>\d+)/$', views.edit_paper, name='edit_paper'),
     path('', views.HomePageView.as_view(), name='home'),
]

我发现,如果我从(?P<pk>\d+)模式中删除edit_paper,则页面加载正常。 (即

如果

http://127.0.0.1:8000/paper/796134/正确加载 url(r'^edit/(?P<pk>\d+)/$', views.edit_paper, name='edit_paper'),成为 url(r'^edit/$', views.edit_paper, name='edit_paper'),

这将解决问题,但我相信我实际上需要以(?P<pk>\d+)模式使用edit_paper。这是 因为我需要通过将pk作为参数包含在表单操作中,从而将纸张的edit_paper传递回{{object.pk}}函数。

请告知最好的行动方案是什么!非常感谢!

这是edit_paper_modal.html模板,我在其中将纸张的pk返回给edit_paper函数,以将有关纸张的更新信息保存在数据库中。

<div class="modal-dialog modal-lg" role="document">
    <form action="{% url 'search:edit_paper' %} pk={{object.pk}}" method="post" class="form" >
      {% 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>
    </form>
</div>

这是paper_detail.html中的ajax函数,它将调用load_paper函数以模式形式加载纸张:

<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({
        type: $(this).attr('method'),
        data: {'pk': pk},
        url: "{% url 'search:load_paper' %}",
        context: document.body,
        error: function(response, error) {
            alert(error);
        }
    }).done(function(response) {
        modal.html(response);
    });
  });
});
</script>

## the button in the paper_detail.html

<button type='button' class="btn btn-primary" data-toggle="modal" data-target="#modal" id="myBtn" data-pid={{paper.pk}}>Edit Paper Details</button>


要以模式形式加载记录,我在load_paper中有一个views.py函数:

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,
        'form': form,
        })

def edit_paper(request, pk=None):
    template_name = 'edit_paper_modal.html'
    if request.POST:
        paper = get_object_or_404(Paper, pk = pk)
        form = PaperForm(instance=paper, data=request.POST)
        if form.is_valid():
            form.save()
    return render(request, 'paper_detail.html', {'paper': paper})

def paper_detail(request, pk):
    paper = get_object_or_404(Paper, pk=pk)
    return render(request, 'paper_detail.html', {'paper': paper}) 

编辑:

包括paper_detail.html

{% if paper %}

        <h4>Details for <b>{{ paper.title }}</b></h4>
        <!-- <form method="post" enctype="multipart/form-data">
          {% csrf_token %}

        </form> -->
        <button type='button' class="btn btn-primary" data-toggle="modal" data-target="#modal" id="myBtn" data-pid={{paper.pk}}>Edit Paper Details</button>
        {% csrf_token %}

       <!-- Modal -->
       <div class="modal fade" id="myModal" role="dialog" > {% csrf_token %}
         <div class="modal-dialog">
         </div>
       </div>

        <p>Status: {{paper.get_status_display }} </p>
        <a href="#" class="like_button" data-pid="{{ paper.pk }}"> <span class="like_span fa fa-thumbs-up"></span>
            <strong id="like_count_{{ paper.pk }}">{{paper.likes}} </strong> </a>
            <p>Abstract:
                <br>{{ paper.abstract }}</p>

        {% endif %}


    </div>

1 个答案:

答案 0 :(得分:0)

在您的<form>中,您太早关闭了{% url ... %}标签。现在它说:

<form action="{% url 'search:edit_paper' %} pk={{object.pk}}">

但是您应该将其替换为:

<form action="{% url 'search:edit_paper' pk=object.pk %}">

请注意,在模板标记中,不要不要对变量使用双大括号({{ ... }})。