2009-12-16 3 views
3

초보자 질문에 죄송 합니다만 ...장고 inlineformsetfactory - 무엇이 좋은가요?

inlineformset_factory의 유스 케이스는 무엇입니까?

#Models 
class Author(models.Model): 
    name = models.CharField(max_length=100) 

class Book(models.Model): 
    author = models.ForeignKey(Author) 
    title = models.CharField(max_length=100) 

#View 

def jojo(request): 

    BookFormSet = inlineformset_factory(Author, Book) 
    author = Author.objects.get(name=u'Mike Royko') 
    formset = BookFormSet(instance=author) 


    return render_to_response('jojo.html', { 
     'formset': formset, 
    }) 

#jojo.html 
<form action="" method="POST"> 
<table> 

{{ formset }} 

</table> 
<input type="submit" value="Submit" /> 
</form> 

을하지만 책 필드 만 표시 :

내가 장고 문서에서 예를 따랐다.

제 생각에 formset은 장고 관리자와 같이 인라인 작성자 양식이있는 책 양식을 표시합니다. 그 위에 나는 쉽게 formset에 초기 값을 전달할 수 없다?

그런 다음 두 개의 별도 AuthorForm 및 BookForm을 사용하는 것이 더 좋은 방법은 무엇입니까?

아니면 뭔가 분명하지 않습니까?

답변

1

inlineformset_factory (및 modelformset_factory)의 장점은 단일 양식에서 여러 모델 인스턴스를 생성 할 수 있다는 것입니다. 단순히 '두 개의 별도 양식 사용'이라면 양식 필드의 ID가 서로 엉켜 버릴 것입니다.

formset_factory 함수는 추가 인수를 통해 필요한 추가 양식 (세트) 수를 알고 적절하게 필드의 ID를 설정합니다.

+0

그래서 만약 내가 올바르게 inlineformset_factory 이해 "그냥"더 나은. 하지만 여전히 ID 충돌을 방지하기 위해 "일반"양식의 접두어를 지정할 수 있습니다. – Mike

2

inlineformset_factory는 중첩 요소에 대해 여러 양식 만 제공하므로 주 모델에 대한 양식을 원하면 별도의 양식이 필요합니다.

views.py

from django.shortcuts import get_object_or_404, render_to_response 
from django.forms.models import inlineformset_factory 
from django.http import HttpResponseRedirect 
from django.template import RequestContext 

from App_name.models import * #E.g. Main, Nested, MainForm, etc. 

: 여기

상단에 내장 된 메인 형태와 예 작업 inlineformset_factory이다. . .

@login_required 
def Some_view(request, main_id=None, redirect_notice=None): 
    #login stuff . . . 
    c = {} 
    c.update(csrf(request)) 
    c.update({'redirect_notice':redirect_notice})#Redirect notice is an optional argument I use to send user certain notifications, unrelated to this inlineformset_factory example, but useful. 

    #Intialization --- The start of the view specific functions 
    NestedFormset = inlineformset_factory(Main, Nested, can_delete=False,) 
    main = None 
    if main_id : 
     main = Main.objects.get(id=main_id)#get_object_or_404 is also an option 

    # Save new/edited Forms 
    if request.method == 'POST': 
     main_form = MainForm(request.POST, instance=main, prefix='mains') 
     formset = NestedFormset(request.POST, request.FILES, instance=main, prefix='nesteds') 
     if main_form.is_valid() and formset.is_valid(): 
      r = main_form.save(commit=False) 
      #do stuff, e.g. setting any values excluded in the MainForm 
      formset.save() 
      r.save() 
      return HttpResponseRedirect('/Home_url/') 
    else: 
     main_form = MainForm(instance=main, prefix='mains') #initial can be used in the MainForm here like normal. 
     formset = NestedFormset(instance=main, prefix='nesteds') 
    c.update({'main_form':main_form, 'formset':formset, 'realm':realm, 'main_id':main_id}) 
    return render_to_response('App_name/Main_nesteds.html', c, context_instance=RequestContext(request)) 

template.html는

{% if main_form %} 
<form action="." method="POST">{% csrf_token %} 
    {{ formset.management_form }} 
    <table> 
     {{main_form.as_table}} 
     {% for form in formset.forms %} 
      <table>{{ form }}</table> 
     {% endfor %} 
    </table> 
    <p><input type="submit" name="submit" value="Submit" class="button"></p> 
</form> 
{% endif %} 
inlineformset_factory
1

형태의리스트를 생성한다.

같은 형태는 예를 들어, 페이지를 반복 할 필요가있을 때 사용할 수 있습니다

  • 업로드 여러 사진의 설명과 함께.
  • 저자에 대한 도서 목록을 기입
  • 시간
  • 당 일정 그리드를 기입 이메일
  • 여러 회원을 초대합니다.

일부 JavaScript 코드에서는 "다른 행 추가"기능을 추가 할 수 있습니다.