2016-11-27 6 views
1

저는 장고를 처음 접했고 표준 라이브러리 응용 프로그램을 빌드하여 시작할 것이라고 생각했습니다.여러 인수가있는 장고 동적 URL

내가 처음 만들어 낸 단어는 http://127.0.0.1:8000/Albums/[album /을 통해 저널의 모든 기사를 보여주는 슬러그를 사용하는 URL 패턴입니다.

이것은 효과가 있습니다. 그 때 내가 시도한 것은 기사 이름을 클릭 할 수있게하여 노래에 대한 세부 정보가 포함 된 페이지로 안내합니다. 특히이 세부 정보가 http://127.0.0.1:8000/Albums/[article 이름/[article_id]/양식의 링크를 통해 액세스 할 수 있기를 바랍니다. 현재 article_id는 모든 기사를 포함하는 데이터베이스 테이블의 기본 키입니다.

urlpatterns = [ 
    url(r'^(?P<slug_journal>[\w-]+)/$', views.Journal_Article_Page, name='Journal_Page'), 
    url(r'^(?P<slug_journal>[\w-]+)/(?P<id>\d+)/$', views.Journal_Article_Page, name='Journal_Article_Page'), 
] 

및 전망 :

def Journal_Article_Page(request, slug_journal=None, id=None): 
    if slug_journal: 
     if id: 
      farticle = get_object_or_404(Article_Draft_Table_1, DRAFT_ID = id) 
      return render(request, 'journal_article_details.html', { 'farticle': farticle, 'fjournal': slug_journal }) 
     else: 
      fjournal = get_object_or_404(Journal_Table, Journal_slug = slug_journal).JOURNAL_ID 
      articles = Article_Draft_Table_1.objects.filter(JOURNAL_ID = fjournal) 
      return render(request, 'journal_articles.html', { 'articles': articles }) 

그리고 마지막으로 템플릿 : 다음으로 끝날

{% extends 'base.html' %} 

{% block content %} 

    <p>List of articles.</p> 

    <br> 

    {% for article in articles %} 
     <div class="col-sm-10"> 
     <a href='{% url "Journal_Article_Page" slug_journal=fjournal id=article.DRAFT_ID %}'>{{ article.Draft_title }}</a> 
     </div> 
    {% endfor %} 

{% endblock %} 

수행하기 위해

그래서 두 개의 URL 패턴을 정의 다음과 같은 오류가 발생했습니다 :

Reverse for 'Journal_Article_Page' with arguments '()' and keyword arguments '{'id': 3, 'slug_journal': ''}' not found. 1 pattern(s) tried: ['Journals/(?P<slug_journal>[\\w-]+)/(?P<id>\\d+)/$'] 

slug_journal 문자열이 올바르게 전달되지 않는다는 것을 나타내는 것으로 보이는 것이 어느 것입니까? 실제로 템플릿의 fjournal을 특정 저널 이름의 실제 문자열로 바꾸면 모든 것이 작동합니다. 나는 이제이 문제를 해결하기 위해 여러 가지 방법을 시도했지만 해결책을 찾지 못한 것처럼 보입니다. 값이 전달되지 않거나 템플릿에서 올바르게 값을 참조하지 않는지 여부는 실제로 알지 못합니다. 어떤 도움을 주시면 감사하겠습니다!

+1

'fjournal' 변수를 컨텍스트 dict에 전달하지 않습니다. 이 딕트 {{ 'articles': articles}'에는'articles' 변수 만 있습니다. 그것에'fjournal' 인수도 추가하십시오. – xyres

+0

그 부분은 목록에 해당합니다. 거기에 단 하나의 논쟁 만 있으면 안됩니다. 또는 if 문의 다른 옵션을 어떻게 든 혼란스럽게합니까? – DisneylandSC

+0

그 문맥에 추가하는'fjournal'을 추가하려고 시도 했습니까? 그리고 거기에는 변수 하나만 있으면 안됩니다. 원하는만큼 추가 할 수 있습니다. – xyres

답변

3

당신은 컨텍스트에서 fjournal 값을 포함하지 않은, 그래서 템플릿 엔진은 빈 문자열을 사용합니다 : 난 그냥 urlpatterns의 URL이 도움이 될 것입니다 교환 믿는다. 패턴은 슬러그에 적어도 하나의 문자가 있어야하므로 빈 슬러그 문자열이 임의의 URL 패턴과 일치하지 않습니다. [\w-]+.

fjournal을 컨텍스트 사전에 포함시켜야합니다. 이 같은 것이 아마 잘 작동 할 것입니다.

return render(request, 'journal_articles.html', 
       {'articles': articles, 'fjournal': slug_journal}) 

또한, 당신의 코드를 읽고 기사 목록 대신 모두 Journal_Article_Page를 사용하여 서로 다른 두 가지보기 기능으로 문서 자체를 분할하는 경우 유지하기 쉬울 것이다.

함수 이름에 소문자 만 사용하는 것도 규칙입니다. 그래서 함수를 article_pagejournal_article_list 또는 이와 비슷한 것으로 부를 수 있습니다.

+0

이것이 내 문제를 해결했습니다! 감사. 이것을 두 가지 별개의 견해로 바꾸는 것이 왜 당신에게 더 나을지에 대해 더 많은 것을 말할 수 있습니까? – DisneylandSC

+0

주관적인 의견입니다. 명확하고 명확한 코드는 유지 관리 및 디버그가 더 쉽습니다. 하나의 URL 경로 -> 하나의보기 기능. 단순한 것이 복잡한 것보다 낫습니다. Flat은 중첩 된 것보다 낫다. 가독성이 중요합니다. https://www.python.org/dev/peps/pep-0020/ –

1

장고는 url 패턴의 각 패턴을 시도하고 요청에 해당하는 첫 번째를 반환합니다.

urlpatterns = [  
url(r'^(?P<slug_journal>[\w-]+)/(?P<id>\d+)/$', views.Journal_Article_Page, name='Journal_Article_Page'), 
url(r'^(?P<slug_journal>[\w-]+)/$', views.Journal_Article_Page, name='Journal_Page'), 
] 
+0

응답 해 주셔서 감사합니다. 나는 슬프게도 나에게 똑같은 오류를 주었다. – DisneylandSC

+0

@DisneylandSC는 Haken Lid가 그의 대답과 스왑 URL에서 말한 것처럼 fjournal 값을 컨텍스트에 추가해야하는 것처럼 보입니다. – neverwalkaloner