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