1

장고에 formset이 있습니다.Django의 모델 formset에서 데이터 가져 오기

나는

{% for form in formset %} 
    {{ form.name }} 
{% endfor %} 

해당 formset 양식과 몇 가지 추가 형태로 검색어 세트 구성으로 템플릿이 해당 formset을 인쇄 할 수 있습니다. 하지만 폼으로 표시하지 않는 쿼리 세트의 필드 값이 필요합니다. 이것이 어떻게 가능한지? 그것은 prefetch_related을 가진 queryset입니다. 그래서 필드는 실제로 모델에 없지만 제 queryset에 조인됩니다.

내 모델 내의 검색어가 Person.objects.prefetch_related('grade_set')입니다

class Person: 
    name = CharField(max_length=200) 

class Grade: 
    person = ForeignKey(Person) 
    grade = IntegerField() 

있습니다.

내 템플릿입니다

{% for form in formset %} 
    Object id: {{ obj.id }} 
    {{ form.name }} 
    {{ obj.grade_set.all|running_total }} 
{% endfor %} 

내가 obj이 정의되지 않은 것을 알고,하지만 난 그게 어쩌면 템플릿에이 같은 일을 할 수있을 것이라고 생각 :

{% for obj, form in object_formset %} 
    Object id: {{ obj.id }} 
    {{ form.name }} 
    {{ obj.grade_set.all|running_total }} 
{% endfor %} 

을 지금 내 해당 formset을 형식으로 만 구성되어 있지만 개체 목록이 필요하며이 개체 목록에서 일부 양식을 만들 수 있습니다. 나는 폼을 생성하고 필드 이름과 입력 이름을 사용하여 작은 해킹을 할 수 있고 Django의 양식 작성 방법을 완전히 피할 수 있지만 어리석은 것이라고 생각합니다. 다른 방법이있을거야.

+0

언급하신 모델과 양식을 포함하십시오. 너무 추상적 일 때 참조하는 내용을 말하기는 어렵습니다. – sgarza62

+0

또한 "queryset에서 일부 필드 값이 필요합니다"라고 말하면 제출 된 양식을 처리하는보기에서 필드 값이 필요하다는 의미입니까? 아니면 템플릿에서? – sgarza62

+1

내 질문을 업데이트했습니다. – Jamgreen

답변

2

예, 을 사용할 수 있습니다.

# somewhere in views.py... 
people = Person.objects.prefetch_related('grade_set') 
formset = # ...(create your modelformset)... 
people_and_formset = zip(people, formset) 

# somewhere in template.html... 
{% for person, form in people_and_formset %} 
    {{ person.id }} 
    {{ form.name }} 
    {{ person.grade_set.all|running_total }} 
{% endfor %} 

Persongrade_set은 검색어 세트 캐시에서 찾을 수, prefetch_related를 사용하는 데, 그리고 DB에 또 다른 타격을 필요로하지 않습니다.

+0

이것은 훌륭합니다. 문제는 django-extra-views에서'UpdateWithInlinesView'를 사용하고'get_context_data'에서 인라인 변수를 변경하는 방법을 모른다는 것입니다. 너 나 좀 도와 줄 수있어? https://github.com/AndrewIngram/django-extra-views/blob/master/extra_views/advanced.py에서 코드를 살펴 보았습니다 – Jamgreen

+0

많은 다른 일을 시도했지만 오류가 발생했습니다. 'zip argument # 2는'kwargs [ 'obj_and_formset'] = zip (queryset, self.get_formset_class())'및'formset = zip (queryset, inlineformset_factory (self.model, self.get_inline_model(), ** self.get_factory_kwargs()))' – Jamgreen

+0

@ Jamgreen 불행히도, 게시 한 것과는 전혀 다른 질문이며'django-extra-views' 저장소에 익숙하지 않습니다. 또한 관련 코드를 표시하지 않습니다. 새로운 질문을하고 싶을 수도 있습니다. – sgarza62