2012-05-20 3 views
4

기술적 인 질문이 적어 "올바른 방법으로이 일을하고 있습니까"라는 질문이 더 많습니다.Django 게시물 및 응답

내가 가진 여러 모델

을 정의 나는 JQuery와 및 많은 HTML 페이지가 그들을 채우기 위해, 그래서 그들은 단순히 인해 작업의 성격에 HTML 양식을 통해 채울 수 없습니다

class Style(models.Model): 
    tag_xml = models.TextField() 
    image = models.ImageField(upload_to="styles") 
    user = models.ForeignKey(User) 
    uploaded = models.DateField() 

class StyleMatch(models.Model): 
    style = models.ForeignKey(Style) 
    item = models.ForeignKey(FashionItem) 
이벤트 함수 및 기타 자바 스크립트. 저장 버튼 내가 아약스를 (전화 클릭)하고 수집 된 모든 변수를 전달할 때

var saveRequest= $.ajax({ 
url: "/save_style/", 
type: "POST",   
data: "selection="+s+"&user="+user+"&src="+image_src, 
dataType: "text"  
}); 

내 save_style보기 다음 모델로 값을 저장

def save_style(request): 
if request.method == 'POST': 
    selection = request.POST['selection'].rsplit("|") 
    user = request.POST['user'] 
    src = request.POST['src'] 

    f = open(MEDIA_ROOT+src) 
    image_file = File(f) 

    u = User.objects.get(id=user) 

    style = Style(tag_xml = "", 
        image = image_file, 
        user = u, 
        uploaded = date.today()) 
    style.save() 

    for s in selection: 
     if (s != ''): 
      match = FashionItem.objects.get(id=s) 
      styleMatch = StyleMatch(style = style, 
            item = match) 
      styleMatch.save() 

    i = StyleMatch.objects.filter(style=style) 
    items = FashionItem.objects.filter(id__in=i) 

    return render_to_response('style_saved.html', dict(image=src, items=items, media_url = MEDIA_URL), context_instance=RequestContext(request)) 

이 일 후에 내가 정말 원하는 성공 페이지로 이동하여 방금 모델에 추가 한 레코드를 표시합니다. 그러나 render_to_response을 사용하고 자바 스크립트에서 전체 페이지를 다시 작성해야하는 모델 정보를 다시 전달하면 새 템플릿으로 리디렉션하는 것이 좋습니다. 나는 HttpResponseRedirect을 사용합니다. a) 나는 값을 되돌릴 수 없으며, b) 꽤 리디렉션되는 것처럼 보이지 않습니다. (becau 그 게시물은 내 자바 스크립트에서 유래하고있다).

그래서 결국 내 질문에

  1. 이 내가이 일을하는 방법을 정말? django 문서는 이 실제로 약간 더 복잡한 영역을 커버하는 것처럼 보이지 않으므로 약간의 확신이 없습니다.
  2. render_to_response 또는 위의 HttpResponseRedirect를 사용해야합니까? 또는 아마도 제 3의 옵션에 대해서는 모른다. .

의견을 보내주십시오.

참고 위의 코드는 이상적이지 않습니다. 유효성 검사, 주석 등이 없습니다. 간단히 데모 목적으로 제공되었습니다. 그러나 심각한 문제를 지적 해 주시기 바랍니다.

답변

0

통과 수집 된 변수

왜하지 $(form).serialize()의 모든?

django.forms.ModelForm를 사용 (또는 그 중 일부)하지 않는 모델

에 값을 저장?

은 꽤 괜찮 리디렉션하지 않는 것으로

AJAX에서 리디렉션이 AJAX 호출을 처리하고 어떻게 든 JS에서 수신 된 데이터를 같이 처리하지 않는 페이지를 열 영향을주지 않기 때문에.

또한 데이터 검증 및 오류보고가 없으므로 좋지 않습니다. 사실 ModelForm은 큰 도움이됩니다.

+0

영업 사원은 HTML 양식을 사용하여 모델 개체를 만드는 것은 적절하지 않으므로 ModelForm을 많이 사용하지 않을 것이라고 말했습니다. – patrickn

+0

내가하고있는 일은 자연스럽게 형태, 이미지 태그 지정 및 동적으로 작성된 결과의 사용자 선택에 적합하지 않습니다. 어쩌면 양식을 사용해야 할 수도 있지만 텍스트 상자 나 라디오 단추 안에 잘 들어 있지 않은 데이터의 경우 어떻게해야하는지 모르겠습니다. 제안 해 주셔서 감사합니다. – debugoz

1

응용 프로그램의 특성에 따라 JavaScript로 페이지 전체를 구성하지 않아야합니다. 그러나 우리는 이미 거기에있어 좋은 결과와 함께 다음과 같은 솔루션을 사용했습니다 :

내가 그들을 호출 할 때 템플릿 "조각"을 만드는 것을 고려하십시오. 이는 AJAX를 통해 전송되는 데이터를 캡슐화하도록 설계된 HTML 코드입니다. 이 조각에 대한 render_to_response를 수행하고 처리 된 뷰 데이터를 변수로 전달한 다음 AJAX를 통해이 데이터를 검색하고 JavaScript를 사용하여 지정된 div 요소 내의 HTML을 반환 된 데이터로 바꿉니다.

위의 해결 방법에는 템플릿 조각에 스타일 지정 및 이벤트 처리기 첨부와 같은 몇 가지 함정이 있지만 최소한 작동시켜야합니다. 이와 관련하여 jQuery의 .on()에 익숙해집니다.

+0

페이지가 완전히 django html 템플릿을 기반으로하는 javascript에서 생성되지는 않습니다.이 특정 페이지와 관련된 많은 양의 javascript가있을뿐입니다. 사실 나는 ajax 요청을 제출 한 결과 섹션을 가지고 있으며, render_to_response를 사용하여 다시로드하지 않고 페이지를 멋지게 업데이트합니다. 그러나 지금은이 결과를 저장/커밋하고 싶습니다. 실제 저장은 문제가 아닙니다. render_to_response 대신 현재 페이지를 다시 작성하는 대신 다른 페이지로 리디렉션하고 싶습니다. 다행히도 그것은 의미가 있습니다. – debugoz

+0

위에서 언급 한 방법을 사용하여 전체 페이지를 다시 작성할 필요는 없습니다.

Your content and variables here
과 같은 HTML 조각을 사용하여 전체 문서를 다시 렌더링하지 않고 기존 문서에 삽입 할 수 있습니다. AJAX로이 조각을 가져 오는 한, 당신은 황금색이어야합니다. – patrickn