2010-03-01 1 views
18

는 여기에 내가 그 일을 해요 방법 :어떻게 장고에서 동적 formset을 만들겠습니까?

{{ formset.management_form }} 
<table> 
    {% for form in formset.forms %} 
     {{ form }} 
    {% endfor %} 
</table> 
<a href="javascript:void(0)" id="add_form">Add Form</a> 

그리고 여기 JS있어 : 특별히 날 귀찮게 무엇

var form_count = {{formset.total_form_count}}; 
$('#add_form').click(function() { 
    form_count++; 
    var form = '{{formset.empty_form|escapejs}}'.replace(/__prefix__/g, form_count); 
    $('#forms').append(form) 
    $('#id_form-TOTAL_FORMS').val(form_count); 
}); 

내가 escapejs 템플릿 자신을 태그 것을 써야했다 있다는 것입니다. 모든 줄 바꿈을 제거하고 작은 따옴표를 이스케이프 처리하여 내 문자열을 엉망으로 만들지 않습니다. 그러나 Django 제작자는이 상황에서 우리가 정확히 무엇을해야한다고 생각 했습니까? 그리고 그들은 왜 TOTAL_FORMS 숨겨진 필드를 가지고 있는데, 단지 <input name="my_form_field[0]" />과 같은 배열을 사용하고 그 길이를 계산할 수 있었을까요?

+1

하지만 왜 당신이 장고 템플릿과 자바 스크립트를 혼합입니까? – Prashanth

+0

내가 처리 할 수 ​​있도록. 그렇지 않으면 뷰에서 완전히 사용자 지정 양식 처리를 작성해야합니다. 그리고 Django는이 방법을 장려하는 것 같습니다. * 왜 그들이 * __prefix__와 함께이'empty_form'을 제공 했으므로 아마도 당신이 대체 할 수 있습니다. – mpen

+1

나는'.empty_form'의 사용법을 좋아합니다. 감사! –

답변

5

장고에 몇 군데가있는 곳 "는 이유"그게이 장고 관리 앱 구현 방법, 나는이 그들 중 하나라고 생각하기 때문이다. 따라서 대답은 그들이 당신 자신의 자바 스크립트를 구현하기를 기대합니다.

이 질문을 참조하십시오. Dynamically adding a form... 더 많은 자바 스크립트 아이디어.

두 개의 플러그 할 수있는 응용 프로그램 (django-dynamic-formsetdjango-dinamyc-form)도 있습니다. 첫 번째를 찾을 때까지 지금까지 보지 못했습니다.

+1

JS를 작성하는 것은 실제로 문제가되지 않습니다 ... 왜 나는 그들이 우리에게 필요한 도구의 절반만을 제공했는지 궁금합니다. 그들은 'empty_form'이 될 수 있다고 말합니다. 이것을 위해 사용되었지만, 줄 바꿈 등을 사용하여 인쇄합니다. 뭔가 잘못 이해하지 않는 한 JS로 채우려 할 때 그다지 친숙하지 않습니다. 나는 동적 인 formset의 나의 방법을 더 좋아한다라고 생각한다. .. 나는 그것이 클라이언트에 덜 부담을 두지 않고, 더 적은 코드를 필요로한다라고 생각한다. .. 오 잘. .. 나는 단지 nitpicking다고 생각한다. 그러나 나는 많은 것에 아직도 정말로 의견이 맞지 않는다. Django의 디자인 결정. – mpen

+0

Django 적절한 디자인 결정은 JS- 프레임 워크 중립을 유지하는 것입니다. admin은 contrib 앱이며 기술적으로 Django 코어의 일부는 아니지만 formsets (분명히)와 같은 일부 기능은 관리자의 작업에서 나온 것이지만 관리자는 괜찮은 앱이라고 생각하지만 다소 어려움을 겪을 것입니다 웅대 한 디자인의 부족에서. –

+3

아약스로 무엇인가를하거나 새로운 객체를 동적으로 추가하기를 원한다면 Formsets는 엉덩이에 큰 고통이됩니다. Django의 가장 큰 문제점은 Web 2.0 유형의 응용 프로그램을 디자인 할 때입니다. 우리는 거의 6 개월 동안 장고에 투자 한 후 자바 프레임 워크로 전환했지만, 너무 많은 시간을 소비하기로 결정했습니다. –

4

이 질문은 약간 오래된 것이지만 이것을 이해하는 데는 다소 시간이 걸립니다.

나는 숨겨진 필드 등 템플릿에 formset.empty_form 렌더링, 그리고 자바 스크립트에서이 필드를 참조하는 것이 좋습니다. (하지만 ....이 empty_form을 사용하도록 업데이트되지 않았 음을 유의)

[JS] http://code.djangoproject.com/browser/django/trunk/django/contrib/admin/media/js/inlines.js

[HTML 템플릿 : 여기

는 장고 관리 사이트에서 복잡한 동적 해당 formset 예제 해당 formset 만 보통의 HTTP 워크 플로우를 사용하여 자바 스크립트없이 작동하도록 만들어졌습니다 때문에] http://code.djangoproject.com/browser/django/trunk/django/contrib/admin/templates/admin/edit_inline/tabular.html

+0

최근에 (실제로 몇 시간 전에)이 작업을 다시 처리했습니다 ... 양식을 추가 및 제거하고 모든 ID를 업데이트하고 적어도 하나의 양식이 있는지 확인하고 유효성을 검사하는 것은 정말 불쾌합니다. 그들 모두 제대로 ... 아약스/계단식/조건부 선택 드롭 다운과 결합하면 미니어처 악몽이됩니다. – mpen

+0

django inlines.js 예제에서 벗어 났습니까? 내 사이트에 맞게 수정했습니다 (별도의 목록에 버튼 추가 필요). 사소한 것이 아니기 때문에 (js에 익숙하지 않았으므로 시간이 좀 걸렸지 만) 대부분의 로직을 하나의 독립적 인 스크립트에 포함시킬 수 있었다고 생각합니다. – bsk

1

이 있습니다.

장고는 자바 스크립트에 좌우되지 않습니다. 당신이 믹스에 몇 가지 자바 스크립트를 추가하려면

, 당신은 dedicated jquery plugin를 사용할 수 있습니다. 내 경우에는

+1

위시 나는 데모를 볼 수 있었지만 감사합니다. Django는 JavaScript없이 작동하도록 설계되었지만 JavaScript를 빌드하는 데 사소한 문제가있는 것 같습니다.나는 그것이 고통 스럽기 때문에 그들이 그것을 더 가져 갔으면 좋겠다. – mpen

+0

@ 마크 : 사실 데모가 있습니다 :-) http://code.google.com/p/django-dynamic-formset/에서 프로젝트를 다운로드하십시오. 여기에는 장고 데모가 포함되어 있습니다. –

+0

그건 데모가 의미하는 것이 아닙니다. 나는 그것을 다운로드 할 필요없이 ("라이브 데모"?) 의미했다. 수백만 개의 프로젝트와 프로그램이 있습니다 ... 사람들은 시간과 노력에 투자하고 물건을 다운로드하고 추출하거나 설치/컴파일하기 전에 그들이 무엇을 얻고 있는지 알고 싶어합니다. 어쨌든, 당신이 * 추천 해 주었던 것은 내가 우연히 발견 한 무작위적인 것만이 아니고, 나는 그것을 조사 할 것이다 ... (훌륭한 도서관이라면, 그들이 어딘가에서 사용될 것이라고 기대할 것이다. 그냥 링크 할 수 ...) – mpen

1

입니다. 내가 플러그인 장고 - 동적 해당 formset (https://code.google.com/p/django-dynamic-formset/wiki/Usage)

을 사용하고 옵션 "추가"를 수정하고 좋은 일했다.

 $('#formset-table tbody tr').formset({ 
      prefix: '{{ formset.prefix }}', 
      formCssClass: '{{ formset.prefix }}-inlineformset', 
      added: function(obj_tr){ 
   var form = $(obj_tr).html().replace(/\-(\w+)\-(\w+)(fix__)\-/g, '-'); 
       $(obj_tr).html(form); 

      }, 

이 정규 표현식 문자열 [접두사] 교체 - 접두사 피어는 '-'

어쩌면 최선의 해결책이 아니라했다.

1

formset.empty_form을 문자열로 사용할 때 '__prefix__'을 실제 formset 양식 인덱스로 바꾸면 XSS가 가능한 경우가 있습니다. 내 플러그 형 응용 프로그램은 formset.empty_form을 Knockout.js 템플릿으로 변환 한 다음 사용자 지정 Knockout.js 바인딩을 통해 복제합니다. 또한 새로 추가 된 formset 양식이 inlineformsets가있는 전체 양식을 제출하기 전에 동적으로 삭제되면 Knockout.js는 양식 필드 id 색인을 자동으로 다시 계산합니다. 여기 문서입니다 : 인라인 자바 스크립트와 사용자 정의 필드를로드 할 때

https://django-jinja-knockout.readthedocs.org/en/latest/forms.html#dynamically-adding-new-related-formset-forms

Knockout.js 또한 바인딩 XSS를 방지 할 수 있습니다.