2017-11-23 8 views
0

私のアプリでは、フォームを生成するビューがあります。このフォームが有効な場合、ビューは別のフォームである別のビューにリダイレクトされますが、逆の一致のエラーメッセージが表示されます。Django:strange reverse match

私のviews.py:

def uploadData(request, dataType, method): 
    if method == 'single': 
     if dataType == 'Sequence-has-SNP': 
      if request.method == 'POST': 
       form = SeqHasSnpForm(request.POST) 
       if form.is_valid(): 
        idSequence = form.cleaned_data['seq_linked'] 
        return redirect('addSNPsSeq', idSequence) 
      else: 
       form = SeqHasSnpForm() 
      return render(request, 'myapp/upload_sequence-has-snp.html', locals()) 
     else: 
      ... 
    else: 
     ... 


def uploadSNPsToSeq(request, idSequence): 
    seq = Sequence.objects.get(PK_idSequence = idSequence) 
    thisSeqHasSnp = Seq_has_SNP.objects.filter(FK_idSequence = seq.PK_idSequence) 
    snpAll = SNP.objects.all() 
    if request.method == 'POST': 
     form = SelectSNPsForSeqForm(request.POST, snps=snpAll, seqHasSnps=thisSeqHasSnp) 
     if form.is_valid(): 
      print('Yeaaahhh!') 
    else: 
     form = SelectSNPsForSeqForm(snps=snpAll, seqHasSnps=thisSeqHasSnp) 
     print(form) 
    return render(request, 'myapp/SNPs-to-add-to-sequence.html', locals()) 

私urls.py

urlpatterns = [ 
    url(r'^SNPs-to-add-to-sequence_(?P<idSequence>.+)$', views.uploadSNPsToSeq, name='addSNPsSeq'), 
    url(r'^upload_(?P<dataType>[A-Za-z-]+)_(?P<method>(single|batch))$', views.uploadData, name='upload'), 
    ... 
    url(r'^$', views.home, name='home') 
] 

私は私の2つのテンプレートがupload_sequence-has-snp.htmlSNPs-to-add-to-sequence.html呼ばれています。

私は最初のフォームにアクセスでき、たとえばTESTに等しいform.cleaned_data['seq_linked']を選択するので、2つのフォームはOKです。私はuploadSNPsToSeqprint(form)の端子に結果を見ることができますが、このビューの最後の行はNoReverseMatch errorを上げる:

NoReverseMatch at /myapp/SNPs-to-add-to-sequence_TEST 

Reverse for 'upload' with arguments '('', '')' not found. 1 pattern(s) tried: ['myapp/upload_(?P<dataType>[A-Za-z-]+)_(?P<method>(single|batch))$'] 

それはmyapp/upload_...代わりのmyapp/SNPs-to-add-to-sequence_...を探している理由を私は理解していませんか?

ヒント?

+0

あなたのテンプレート 'myappに/のSNPツーアドオンに-sequence.html'(またはそれが拡張テンプレート) '{%url 'upload' ...%}'が含まれています。変数がテンプレートコンテキストで設定されておらず、 '( ''、 '')'に評価されているため、これは失敗しています。 – Alasdair

答えて

0

ありがとうAlasdair!それが問題でした。

は、だから私のviews.pyに私がdataTypeidSequenceを交換し、私のuploadSNPsToSeq機能のためとurls.pyのパラメータは、このビューのURLパターンを変更するようmethodを追加しました。

views.py:

def uploadData(request, dataType, method): 
    if method == 'single': 
     if dataType == 'Sequence-has-SNP': 
      if request.method == 'POST': 
       form = SeqHasSnpForm(request.POST) 
       if form.is_valid(): 
        dataType = form.cleaned_data['seq_linked'] 
        return redirect('addSNPsSeq', dataType, method) 
      else: 
       form = SeqHasSnpForm() 
      return render(request, 'myapp/upload_sequence-has-snps.html', locals()) 
     else: 
      ... 
    else: 
     ... 

def uploadSNPsToSeq(request, dataType, method): 
    seq = Sequence.objects.get(PK_idSequence = dataType) 
    thisSeqHasSnp = Seq_has_SNP.objects.filter(FK_idSequence = seq.PK_idSequence) 
    snpAll = SNP.objects.all() 
    if request.method == 'POST': 
     form = SelectSNPsForSeqForm(request.POST, snps=snpAll, seqHasSnps=thisSeqHasSnp) 
     if form.is_valid(): 
      print('Yeaaahhh!') 
    else: 
     form = SelectSNPsForSeqForm(snps=snpAll, seqHasSnps=thisSeqHasSnp) 
    return render(request, 'myapp/upload_snps-for-sequence.html', locals()) 

urls.py:

urlpatterns = [ 
    url(r'^upload_snps-for-sequence_(?P<dataType>[A-Za-z-]+)_(?P<method>(single|batch))$', views.uploadSNPsToSeq, name='addSNPsSeq'), 
    url(r'^upload_(?P<dataType>[A-Za-z-]+)_(?P<method>(single|batch))$', views.uploadData, name='upload'), 
    ... 
    url(r'^$', views.home, name='home') 
]