2012-02-22 2 views
1

사용자는 여러 가지 매개 변수를 선택하여 데이터의 패싯 쿼리를 허용 할 수 있습니다. 여기에 데이터 입력이 없기 때문에 양식을 GET에 게시하고 결과를 표시하는 다른 템플리트가있는 다른보기가 있습니다.GET으로 Django 폼 유효성 검사

필수 필드가 완료되지 않은 경우 해당 오류가 표시되도록 양식의 유효성을 검사합니다. 순간 내 공정 (간체) 다음과 같습니다

내 검색보기 :

def search(request): 
    ... 
    context['form'] = GraphForm() 
    ... 
    return render(request, 'search.html', context) 

내 결과보기 :

def results(request): 
    if 'submit' in request.GET: 
     # process GET variables as query 
    ... 
    return render(request, 'results.html', context) 

search.html에 템플릿 :

<form action="{% url results %}" method="get">{% csrf_token %} 
{% for field in form %} 
<div class="field_wrapper"> 
    {{ field.errors }} 
    {{ field.label_tag }} {{ field }} 
</div> 
{% endfor %} 
<input type="submit" name="submit" value="Query" /> 
</form> 

양식이 분리 된 다른 URL로 제출되면 뷰 코드를 확인했는데, 유효성 검사 (오류 강조 표시) 및 GET 데이터 확보에 대한 가장 좋은 방법은 무엇입니까?

도움을 주시면 감사하겠습니다.

답변

-2

양식 유효성 검사에 JavaScript/jQuery를 사용하십시오. 당신이해야 할 모든 form에 ID를 추가하고, 해당 자바 스크립트,

document.getElementById("#form").onsubmit = checkForm(); 

또는 성공적인 검증에 따라 참과 거짓 checkForm() 반환, 그렇지

$("#form").submit(checkForm); 

jQuery를

사용하여 그런 짓을. (false를 돌려주지 않으면 양식 제출이 평소와 같이 계속됩니다.)

Django의 템플릿을 사용하여 어떤 필드를 확인하거나 유효성을 검사 할 수 있습니다.

+1

클라이언트 측 유효성 검사는 * 서버 측 유효성 검사,하지만 그것을 대체하지 않습니다뿐만 아니라 좋은 *입니다. 클라이언트 측 유효성 검사에 전적으로 의존한다면 문제가 발생할 것입니다. –

+0

@Chris 동의하지만 그는 "사용자에게 분명하게"(즉, 클라이언트 측) 기능을 요구하는 것 같습니다. – Edwin

+1

좋아, 나는 자바 스크립트가 작동하지만, 장고 (서버 측)에 몇 가지 방법이 있을지도 모르겠다. 다른 URL로 GET을 통해 양식 데이터를 제출하는 것이 일반적인 작업이어야한다고 생각한다. –

1

처럼 request.GET을 양식에 전달할 수 있어야합니다. 이 양식은 data 사전을 허용합니다. 그것이 어디에서 유래하는지 상관하지 않습니다. 벌써 해봤 니?

+0

바인딩 된 양식 (데이터)이 검색보기에서 유효성 검사를 거치며 양식 유효성 검사시 수행 할 작업을 정확히 모르는 경우 - 결과보기로 전달 된 GET 데이터로 리디렉션 하시겠습니까? –

+1

아니요, 결과보기 자체가 GET 데이터를받습니다. 검색보기의 양식에 대한 작업은 결과보기에 대한 링크 여야합니다. 결과보기에서 검색보기와 마찬가지로 양식을 인스턴스화하지만 이번에는'data.'를'request.GET' 형식으로 전달합니다. 양식이 유효한지 확인한 다음 결과를 정상적으로 렌더링하십시오. –

+0

확인. 양식이 유효하지 않은 경우 - 유효성 검증 오류를 표시하거나 오류가있는 결과 페이지에 양식을 표시하기 위해 검색보기로 다시 경로 재 지정합니까? –

1

이 조금 늦게 될 수도 있지만 나는 'POST'워크 플로우에 대한 유사성을 유지하면서 다음 작동합니다 생각 :

대신 검색 결과를 표시하기위한 두 개의 서로 다른 견해를 필요없이 하나 볼 수 있습니다. 그러면 게시 양식에 대해 설명한 normal codepath을 사용할 수 있습니다. 양식 제출을 감지하기 위해 request.method == 'POST'을 사용하는 대신 'submit' in request.GET을 대신 사용합니다. 자바 스크립트를 사용하여 양식을 제출하는 경우 '제출'이 GET 데이터에 포함되어 있는지 확인하거나 숨겨진 필드를 사용하여 양식 제출을 감지하십시오.

views.py

def search(request): 
    context_dict = {} 
    if 'submit' in request.GET: 
     form = GraphForm(request.GET) 
     if form.is_valid(): 
      #do search and add results to context 
      #If you don't want to use a single view, 
      # you would redirect to results view here. 
      results = get_results(**form.cleaned_date) 
      context_dict['results'] = results 
    else: 
     form = GraphForm() 
    context_dict['form'] = form 
    return render(request, 'search.html', context_dict) 

search.html에

<form action="{% url 'search' %}" method="get"> 
    {{form}} 
    <input type="submit" name="submit" value="Query" /> 
</form> 
{% if results %} 
    {% include 'results.html' %} 
{% endif %}