【问题标题】:Django urlpatterns - NoReverseMatch at... Reverse for '' with no arguments not foundDjango urlpatterns - NoReverseMatch at... Reverse for '' with no arguments not found
【发布时间】:2019-06-20 18:14:13
【问题描述】:

我正在 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'),
]

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

http://127.0.0.1:8000/paper/796134/ 正确加载,如果 url(r'^edit/(?P&lt;pk&gt;\d+)/$', views.edit_paper, name='edit_paper'), 变为 url(r'^edit/$', views.edit_paper, name='edit_paper'),

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

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

这是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>


要以模态形式加载记录,我在views.py 中有一个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,
        '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>

【问题讨论】:

    标签: django django-templates django-views


    【解决方案1】:

    在您的&lt;form&gt; 中,您过早地关闭了{% url ... %} 标记。现在它说:

    &lt;form action="<s>{% url 'search:edit_paper' %} pk={{object.pk}}</s>"&gt;

    但您应该将其替换为:

    &lt;form action="{% url 'search:edit_paper' <b>pk=object.pk</b> %}"&gt;

    请注意,在模板标签中,您应该不要对变量使用双花括号 ({{ ... }})。

    【讨论】:

    • 感谢您指出这一点!我解决了这个问题,但是当我加载 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&lt;pk&gt;\\d+)/$']
    • @OnyiL:通常 Django 也会显示模板中出错的部分。您的模板中可能存在另一种情况,或多或少是相同的错误。
    • @OnyiL:请在模板中搜索其他edit_paper url,并尝试重新启动网络服务器。
    • 我看起来很努力,但似乎找不到其他有问题的 edit_paper 网址。另一方面,在查看回溯时,它说以下内容:```模板错误:在模板/Users/onyi/Documents/jikan/jikan/templates/base.html中,第0行错误'edit_paper'反向没有找不到参数。尝试了 1 种模式:['search/edit/(?P\\d+)/']``` 这是否指向与您所说的相同的错误,或者我应该更仔细地检查我的 base.html 吗?
    • 是的,你是不是像{% url 'search:edit_paper' pk=object.pk %} 这样写的,所以pk= in {% url ... %} 块?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-14
    • 1970-01-01
    • 2020-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多