2017-09-27 14 views
0

/プロバイダ/ 121 /更新/ の引数が '(None、)'ではないため、 'provider_update' 1つのパターンが試されました:['providers /(?P \ d +)/ update /']NoReverseMatchでデータソースを渡して、アクションメソッドを作成する際に問題が発生しました。

URLが特定されているパラメータを見つけることができないため、なぜNoReverseMatchエラーがスローされるのか分かります。しかし、なぜ私のパラメータが正しいビューに渡されていないのか分かりません。パラメータ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()の機能にあります。

以下、このコードで私のコメントを参照してください:provider_update()機能で

def save_provider_form(...): 

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

request.methodGETであれば、あなたはinstanceでフォームを初期化しているが、request.methodGETある場合save_provider_form()に、あなたが再初期化されていますフォームは一切ありません。したがってidNoneなのでNoneです。

+1

oh wow。それは私のことがとてもうんざりです。私はこれを理解しようと3時間以上かけて過ごしました。本当にありがとう –

関連する問題