我正在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>
答案 0 :(得分:0)
在您的<form>
中,您太早关闭了{% url ... %}
标签。现在它说:
<form action="{% url 'search:edit_paper' %} pk={{object.pk}}">
但是您应该将其替换为:
<form action="{% url 'search:edit_paper' pk=object.pk %}">
请注意,在模板标记中,不要不要对变量使用双大括号({{ ... }}
)。