2014-12-12 3 views
0

Django 데이터베이스에 에 저장되어 있지 않고 모델이없는 테이블의 행을 표시하기 위해 일부 장고 템플릿 코드를 생성 중입니다. 데이터베이스를 알고 필요에 따라 인트로 스코어를 적용 할 수 있지만 손으로 ​​코드를 작성하려면 을 원하지 않습니다.모델 외부의 NoReverseMatch 템플릿 예외

예를 들어, 필드 PSOPRDEFN.OPRCLASS은 특정 행에 선택적 참조를 저장 여기서 PSCLASSDEFN.OPRID = PSOPRDEFN.OPRCLASS 본질적 외래 키 관계. 관계가없는 경우 PSOPRDEFN.OPRCLASS에 ''(공백 문자)가 하나 있습니다. ?

는 또한 URL이 주어진 PSCLASSDEFN 행에 대한 페이지가 다음 P CLASSID 정규 표현식은 PSCLASSDEFN 테이블에 저장됩니다에 해당 공백을 허용하지 않습니다

url(r'^(?i)permissions/(?P<CLASSID>[A-Z0-9_&]{1,50})/$', 
'pssecurity.views.psclassdefn_detail', 
name="psclassdefn_detail"), 

주 - 나는 사용자가 URL 요청에 넣을 수있는 것을 제한하는 것이 더 안전하다고 생각한다.

생성 된 템플릿으로 돌아 가기 : 존재하는 경우 관계에 하이퍼 링크하고 싶습니다.

.... 
    { 
     "colname": "LANGUAGE_CD" 
    }, 
    { 
     "urlname": "security:psclassdefn_detail", 
     "colname": "OPRCLASS", 
     "kwargs": [ 
      { 
       "colname": "dbr", 
       "accessor": "dbr" 
      }, 
      { 
       "colname": "CLASSID", 
       "accessor": "inst.OPRCLASS" 
      } 
     ] 
    }, 
    ... 

일부 아주 사소한 코드 생성 후 결과 : 내 집에서 재배 한 템플릿 발생기 JSON "지시문을"먹이 나는 (영감, 장고 - 테이블 2에 대한 감사) 템플릿에 넣어 원하는 것을 나타내는 :

<div class="row"> 
    <div class="col-xs-6 fieldlabel" title="LANGUAGE_CD" >Language Code</div> 
    <div class="col-xs-6 fieldvalue text-left _fv_LANGUAGE_CD">{{inst.LANGUAGE_CD}}</div> 
</div> 

<div class="row"> 
    <div class="col-xs-6 fieldlabel" title="OPRCLASS" >Primary Permission List</div> 
    <div class="col-xs-6 fieldvalue _fv_OPRCLASS"> 
     {% if inst.OPRCLASS|slugify %} 
     <a href="{% url 'security:psclassdefn_detail' dbr=dbr CLASSID=inst.OPRCLASS %}">{{inst.OPRCLASS}}</a> 
     {% endif %} 
    </div> 
</div> 

내 문제는 PSOPRDEFN 데이터의 일부를 표시 할 때 임의의 템플릿 URL을 확인 오류를 받기 시작하는 것입니다. 결국 일부 행의 빈 OPRCLASS 필드까지 추적했습니다. 이를 방지하기 위해

내가 먼저 필드가 비어 있지 않기 때문에 작동하지 않았다

{% if inst.OPRCLASS %} 
<a ...></a> 
{% endif %} 

을 추가, 그것은합니다 (CLASSID 정규식과 일치하지 않는, 따라서 및) 비어 있습니다. 그래서 여기가 필터 문서를 다시 읽고 slugify가 공백과 비 알파를 제거한다는 것을 알았습니다.

{% if inst.OPRCLASS | slugify %} 
<a ...></a> 
{% endif %} 

작동하지 않습니다. 문제는 CLASSID가 영숫자 만 저장한다는 것입니다.하지만 다른 필드에는 항상 해당되지는 않습니다. 템플릿 생성 런타임에서 테이블 열 정의를 수행하여 수행 할 작업을 검토하는 것은 신경 쓰지 않지만 URL 반전을 사용하지 않도록 적절한 방법을 찾아야합니다 (일부 행에만 해당).

질문 스트립과 같은 더 나은 필터가 있습니까? 내 자신의 필터를 항상 만들 수 있다고 생각합니다.

템플릿 생성 시간에 NoReverseMatch의 예외를 선택적으로 잡을 수있는 태그가 있습니까?

{% try NoReverseMatch %} 
     <a href="{% url 'security:psclassdefn_detail' dbr=dbr CLASSID=inst.OPRCLASS %}">{{inst.OPRCLASS}}</a> 
{% endtry %} 

내 설명에 너무 장황한 이유는 모델을 사용하여 해결할 수있는 것이 아니기 때문입니다. 그리고 수동으로 템플릿을 사용자 정의 할 수 없습니다. 나는 장고가 대부분의 경우 모델없이 아주 잘 작동한다는 것을 알지만, 데이터의 몇 줄이 기대에 미치지 않을 때 템플릿에서 뒤집는 URL은 매우 약해질 수있다. 경화는 매우 유익 할 것입니다.

답변

1

url 태그의 결과를 변수에 지정할 수 있습니다.

{% url 'path.to.view' arg arg2 as the_url %} 
{% if the_url %} 
<a href="{{ the_url }}">link</a> 
{% else %} 
No link 
{% endif %} 

이 구문은보기를 되돌릴 수없는 경우 예외를 발생시키지 않습니다.

+0

내 테스트 시나리오에서 작동합니다. 감사! –

+0

업데이트. 대부분의 경우 작동합니다. 그러나 ** the_url **은 일반 컨텍스트 네임 스페이스에 할당됩니다. 그 의미는 다음 패스에서 url이 해결되지 않으면 ** the_url **이 할당되지 않지만 이전의 성공적인 해결 방법이 현재 패스에서 사용 가능하다는 것입니다. 즉, 실수로 마지막으로 계산 된 URL을 가져올 수 있습니다. ** row.the_url **처럼 현재 행에 할당하려고 시도했지만 작동하지 않았습니다. –

+0

흠. 어쩌면 Django는 url 태그가 url을 반대로하지 않는 경우 문맥에서'the_url'을'None'으로 설정하도록 변경되어야합니다. 해결 방법은 [with] (https://docs.djangoproject.com/en/1.8/ref/templates/builtins/#with) 문을 사용하여 코드를 래핑하는 것일 수 있습니다. 즉, {{% with the_url = ''%} }'. – Alasdair

관련 문제