Django urlpatterns - NoReverseMatch at ... Реверс для '' без аргументов не найден - PullRequest
1 голос
/ 20 июня 2019

Я создаю модальную форму в 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>

Это функция ajax в paper_detail.html, которая вызывает функцию 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 голосов
/ 20 июня 2019

В вашем <form> вы закрылись на {% url ... %} тег слишком рано. Теперь он говорит:

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

Но вы должны заменить это на:

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

Обратите внимание, что в теге шаблона вы должны не использовать двойные фигурные скобки ({{ ... }}) для переменных.

...