2017-09-27 20 views
0

NoReverseMatch at/providers/121/update/ 反向提供'provider_update'参数'(None,)'not found。 1模式尝试:['providers /(?P \ d +)/ update /']NoReverseMatch在/有困难通过数据源形成操作方法

我知道为什么NoReverseMatch错误被抛出,因为URL找不到参数被识别。但是,我不明白为什么我的参数没有传递给正确的观点。当我传递一个持有参数ID或PK的var时,由于某种原因它将它识别为None。我查看了类似的问题,但他们没有将数据传递给表单操作的问题。任何帮助表示赞赏!由于

partial_provider_update.html

<form method="post" action="{% url 'provider_update' form.instance.id %}" class="js-provider-update-form"> 
    {% csrf_token %} 
    <div class="modal-header"> 
    <h4 class="modal-title">Update Provider</h4> 
    </div> 
    <div class="modal-body"> 
    {% include 'providers/includes/partial_provider_form.html' %} 
    </div> 
    <div class="modal-footer"> 
    <button type="button" class="btn btn-default" data-dismiss="modal">Close</button> 
    <button type="submit" class="btn btn-primary">Update provider</button> 
    </div> 
</form> 

partial_provider_list.html

 {% for provider in object_list %} 
     <tr> 
      <td>{{ provider.id }}</td> 
      <td>{{ provider.name }}</td> 
      <td>{{ provider.organization }}</td> 
      <td>{{ provider.emr }}</td> 
      <td>{{ provider.date|date:"Y-m-d" }}</td> 
      <td style="width: 100px; vertical-align: center; padding-top: 9px"> 
       <button type="button" 
        style="height: 25px; font-size: 16px;width: 50px; padding: 0px" 
        class="btn btn-warning btn-sm js-update-provider" 
        data-url="{% url 'provider_update' provider.id %}"> 
         Edit 
       </button> 
      </td> 
     {% empty %} 
      <tr> 
       <td colspan="5" class="text-center bg-warning">No Providers</td> 
      </tr> 
     {% endfor %} 

urls.py

from django.conf.urls import url, include 
from django.views.generic import ListView, DetailView, TemplateView 
from providers.models import Provider 
from providers import views 

urlpatterns = [ 
    url(r'^$', ListView.as_view(queryset=Provider.objects.all().order_by("id"), template_name='providers/home.html')), 
    url(r'^create/', views.provider_create, name='provider_create'), 
    url(r'^(?P<pk>\d+)/update/', views.provider_update, name='provider_update'), 
] 

views.py

# -*- coding: utf-8 -*- 
from __future__ import unicode_literals 
from django.shortcuts import render, get_object_or_404 
from django.template.loader import render_to_string 
from django.http import JsonResponse 
from providers.models import Provider 
from .forms import ProviderForm 

def index(request): 
    return render(request, 'providers/home.html') 

def save_provider_form(request, form, template_name): 
    data = dict() 
    if request.method == 'POST':  
     if form.is_valid(): 
      form.save() 
      data['form_is_valid'] = True 
      object_list = Provider.objects.all() 
      data['html_provider_list'] = render_to_string('providers/includes/partial_provider_list.html', { 'object_list' : object_list }) 
     else: 
      data['form_is_valid'] = False 
    else: 
     form = ProviderForm() 
    context = {'form': form} 
    data['html_form'] = render_to_string(template_name, context, request=request) 
    return JsonResponse(data) 

def provider_create(request): 
    if request.method == 'POST': 
     form = ProviderForm(request.POST) 
    else: 
     form = ProviderForm() 
    return save_provider_form(request, form, 'providers/includes/partial_provider_create.html') 

def provider_update(request, pk): 
    provider = get_object_or_404(Provider, pk=pk) 
    if request.method == 'POST': 
     form = ProviderForm(request.POST, instance=provider) 
    else: 
     form = ProviderForm(instance=provider) 
    return save_provider_form(request, form, 'providers/includes/partial_provider_update.html') 

回答

1

问题出在save_provider_form()函数。

看到我的评论在下面这段代码:

def save_provider_form(...): 

    if request.method == 'POST':  
     ... 
     else: 
      ... 
    else: 
     # ################### # 
     # HERE IS THE PROBLEM # 
     # ################### # 
     form = ProviderForm() # form is re-initialized with no instance 

provider_update()功能,如果request.methodGET,您正在使用instance初始化的形式,但在save_provider_form()如果request.methodGET,你重新初始化没有实例的形式。所以idNone,因为实例是None

+1

哦哇。那如此渺茫的我。我花了3个多小时试图弄清楚这一点。非常感谢 –