【发布时间】: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<pk>\d+),页面加载正常。 (即
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'),
这将解决问题,但我相信我实际上需要在 edit_paper 模式中使用 (?P<pk>\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