2010-01-10 5 views
2

URL 패턴을 통해 객체 값을 전달하고 뷰 기능에서 사용할 수 있다는 것을 알고 있습니다. 예를 들어 :URL을 통해 객체 데이터 전달

(r'^edit/(?P<id>\w+)/', edit_entry), 

이 같이 활용 될 수있다 :

def edit_entry(request, id): 
     if request.method == 'POST': 
       a=Entry.objects.get(pk=id) 
       form = EntryForm(request.POST, instance=a) 
       if form.is_valid(): 
         form.save() 
         return HttpResponseRedirect('/contact/display/%s/' % id) 
     else: 
       a=Entry.objects.get(pk=id) 
       form = EntryForm(instance=a) 
     return render_to_response('edit_contact.html', {'form': form}) 

하지만 어떻게 내가 URL에 모델 필드에서 ("ID"이외의) 값을 전달합니까? 예를 들어, 하위 모델 "OrderForm"및 "SpecReport"가 공유하는 "job_number"필드가있는 추상 기본 모델이 있습니다. 주문 양식에서 "job_number"를 클릭하고 동일한 작업 번호에 대한 Spec Report를 호출하고 싶습니다. 나는 URL로 정보를 전달하기 위해

href="/../specifications/{{ record.job_number }} 

를 만들 수 있습니다,하지만 난 이미 정규식 구문이 잘못 알고 :

(r'^specifications/(?P<**job_number**>\w+)/', display_specs), 

을도 내가보기에 job_number 같은 방법으로 캡처 할 수 있습니다 I could could id :

def display_specs(request, job_number): 
    records = SpecReport.objects.filter(pk=job_number) 
    tpl = 'display.html' 
    return render_to_response(tpl, {'records': records }) 

여기에 쉬운 접근 방법이 있습니까 아니면 그것이 생각보다 복잡합니까?

(r'^specdisplay/?agencyID=12/', display_specs), 

과 :

수정 된 코드는 다음과 같습니다

def display_specs(request, agencyID): 
    agencyID= request.GET.get('agencyID') 
    records = ProductionSpecs.objects.filter(pk=id) 
    tpl = 'display_specs.html' 
    return render_to_response(tpl, {'records': records }) 

필터링하는 방법을 잘. pk는 더 이상 적용되지 않습니다.

+0

나는 당신의 유일하게 남아있는 문제는 URL 정규식 생각 : 모든 물음표 (포함)를 이동 한 후이 들어

는이처럼 urlconf에 named urls을 사용하여 시작해야 작동합니다. 이것들은 GET 매개 변수라고하며 일치하는 항목의 일부가 아닙니다. –

답변

6

예,하고 있습니다이 조금 더 복잡 그것이이다.에서

당신의 urls.py 당신은 :

(r'^edit/(?P<id>\w+)/', edit_entry), 

지금 방금 display_specs에 대해 거의 동일한 표현을 추가해야합니다 정규식에

(r'^specifications/(?P<job_number>\w+)/', display_specs), 

괄호는 그룹을 식별하고 (?P<name>...)을 정의 이름이 인 그룹 name이라고합니다. 이 이름이보기에 매개 변수입니다.

따라서,보기는 이제 보일 것 같은 :

마지막으로
def display_specs(request, job_number): 
    ... 

, 당신이 사용하는 대신,보기로 리디렉션 할 때, 작동하더라도 :

HttpResponseRedirect('/path/to/view/%s/' % job_number) 

사용 DRY 더를 :

HttpResponseRedirect(
    reverse('display_specs', kwargs={'job_number': a.job_number})) 

이제 리소스 경로를 변경하면 리디렉션이 브리핑되지 않습니다. ak.

url(r'^specifications/(?P<job_number>\w+)/', display_specs, name='display_specs'), 
+0

나는 이것을 먼저 시도했다. 하지만 django는 404 오류를 발생시킵니다. "agencyID"가 "EMP-INT-37914"이고 url이 작성된 경우 (r '^ specdisplay/(? P \ w +) /', display_specs) - Django가 말합니다 : 요청 URL : \t http : // localhost : 8000/specdisplay/EMP-INT-37914 다음 URL을 시도/ : ^ specdisplay/난 당신이 표현 같은 방법을 쓸 수 없습니다 간주 이유/ ... 입니다 (+ 승 P \?) . – kjarsenal

+0

명명 된 그룹뿐만 아니라 (나는 그것에 대해 연구하고 있습니다.) 이해하는 것이 사실입니다. 그러나이 문제의 핵심은이 구문 "(? P \ w +)"이 괄호 안의 데이터가 정수 형식 일 때만 작동한다는 것입니다. 내 agencyIDs가 문자열 데이터 (모든 광산이있는 경우) django 오류를 던졌다. 과 다르다고 나는 생각할 수있는 유일한 것이 문자열 대 정수입니다."EMP-INT-37914"를 "5"로 변경하면 매력처럼 작동했습니다. 불행히도, 그것은 내 agencyID 데이터가 문자열 데이터이고 나는 여전히 그것을 전달하는 방법을 알아낼 수 없기 때문에 그것은 도움이되지 않습니다. – kjarsenal

+0

패턴 '\ w'는 영숫자 문자 및 밑줄 (예 : [a-zA-Z0-9_])을 의미합니다./(? P EMP-INT- \ d +)/ –

1

모델 구조가 어떨지 모르는 이유는 ... 특정 작업의 ID를 전달한 다음 쿼리로이를 가져올 수없는 이유는 무엇입니까?

모든 모델은 자동으로 증가하는 id 필드를 자동으로 포함하며 행의 고유 식별자 (원하는 경우 색인)이므로 href 생성을 {{record.id}}로 변경하고 거기에서부터 이동하십시오. ^, 정규식은 'R입니다

url: /foo/bar/?job_number=12 

특별한 마크 업 BTW이를 잡으려고 :

단지 이렇게 너무 많은 당신은 꽤 URL을 걱정하지 않는다 특히, 다음 URL을 통해 job_number 전달 시도 푸/바/'

그리고이 같은 관점에서 읽어 :

job_number= request.GET.get('job_number') 
+0

OrderForm 객체의 id가 SpecForm 객체의 id와 같을 필요는 없기 때문입니다. 모든 작업에 대한 주문 양식이 있지만 일부 작업에 대한 사양 양식이있는 경우 ID가 항상 일치한다는 것을 확신 할 수 없다고 생각합니다. 그러나 직업 숫자는 항상 것입니다. 어쨌든 그건 내 논리 였어. 틀릴 수도 있습니다. 이드 루트를 시도해보고 작동하는지 확인하겠습니다. – kjarsenal

+0

이 주석을 충분히 읽을 수 없기 때문에 답변을 편집했습니다. 괜찮습니다. –

+0

도움을 주셔서 감사합니다. 귀하의 조언과 관련하여 코드를 수정하려고했습니다. 아직 거기에 꽤. 위의 수정 된 코드를 빠르게 살펴보고 내가 올바른 방향에 있는지 알려 줄 수 있습니까? 감사. 또한 "job_number"를 "agencyID"로 바꾸는 것이 필드의 실제 이름이므로 그대로 사용하십시오. – kjarsenal

0

난 정말 당신의 질문을 이해하지 않습니다. id을 전달하고 job_number을 전달하는 것의 차이점은 무엇입니까? 네가 할 수 있다면, 왜 너는 다른 걸 할 수 없어? job_number가보기에 일단, 당신은 왜 정상적인 필터를 수행 할 수 없습니다

records = SpecReport.objects.filter(job_number=job_number) 
+0

좋습니다. 이제이 방법으로 필터링하고 있습니다. 고맙습니다. – kjarsenal

+0

job_number가 실제 코드 번호 (예 : "EMP-AS-15751")와 같지 않은 경우에는 차이점이있는 것 같습니다. 불행하게도 많은 기업에서 자사 제품을 식별하는 방식입니다. 정보를 전달할 수 없다고 생각하지 않습니다. 단지 과 동일한 정규 표현식을 사용할 수 있다고 생각하지 않습니다. – kjarsenal

관련 문제