2017-03-08 2 views
0

Django 양식 및 ModelForm 클래스의 꽤 멋진 속성을 사용하는 데 어려움이 있습니다. 특히 모델 인스턴스로 인스턴스화 할 때 양식 인스턴스에 연관된 데이터가 있는지 확인하는 데 문제가 있습니다. 내가 양식을장고 양식이 모델 인스턴스로 인스턴스화 된 경우에도 언 바운드로 표시됩니다.

def set_month_form(request, myid=False): 
if myid: 
    mcoeff=MonthCoeff.objects.get(id=myid) 
    form=MonthForm(instance = mcoeff) 
    categories = False 
else: 
    form=MonthForm() 
    categories=list(MonthCoeff.objects.values('product_category').distinct()) 
import pdb; pdb.set_trace() 
return render(request,'coeffs/forms/django_form.html',{'form':form, 'user': request.user}) 

를 사용하는 경우 여기를 먼저

우리가 views.py의 일부에 도착 forms.py

from django.forms import ModelForm 
from .models import ItemCoeff, MonthCoeff 

class MonthForm(ModelForm): 
"""A class that defines an HTML form that will be constructed for interfacing with the Monthly Coefficients""" 

title='Set Month Coefficient' 
class Meta: 
    model=MonthCoeff 

    fields = ['first_of_month', 'product_category', 'month_coeff', 'notes'] 

class ItemForm(ModelForm): 
""" 
A class that defines a Django HTML form to be constructed for interfacing with the ItemCoeff model. 
""" 
title='Set Item Coefficient' 

class Meta: 
    model=ItemCoeff 
    fields = ['item_num','item_name','item_coeff','notes'] 

다음의 형태의 매우 간단한 설정을 살펴입니다 그리고 나는 렌더링하고 할 때 내 템플릿의 양식 is_bound 속성을 사용하여 제출 버튼 캡션을 설정하려고합니다.

{% if form.is_bound %} 
     <button type="submit" name="button">Update</button> 
{% else %} 
     <button class="btn btn-lg btn-primary" type="submit" name="button">Add</button> 
{% endif %} 

그러나이 방법은 항상 else 조건을 산출합니다. 내가 눈치 채 셨으니, 내 view.py 코드에서 pdb 추적을 설정하고 렌더링하기 직전에 양식 객체를 검사했을 때는 False을 반환합니다. form['first_of_month']이 양식을 만드는 데 사용 된 MonthCoeff 인스턴스와 관련된 값을 반환하는 경우에도 마찬가지입니다.

다른 사람이 기대하지 못했던 is_bound 속성이 왜 응답하지 않는지에 대한 통찰력이 있습니까? Django Docs?

답변

1

하지만 데이터에 바인딩하지 않았습니다. 인스턴스 매개 변수를 제공했습니다. 그러나 이는 전혀 똑같지는 않습니다. 이는 폼을 초기 값을 제공하는 모델 인스턴스와 저장시 업데이트 할 항목과 연결합니다. 바운드 대 언 바운드는 일반적으로 POST에서 데이터를 전달하는지 여부에 따라 결정됩니다.

당신이 인스턴스가 있는지 여부에 따라 버튼을 변경하려면

, 그럼 그냥 그렇게 :

{% if form.instance %} 
     <button type="submit" name="button">Update</button> 
{% else %} 
     <button class="btn btn-lg btn-primary" type="submit" name="button">Add</button> 
{% endif %} 
+0

감사합니다, 매력처럼 작동 할 수. "바인딩 된"대 "인스턴스"를 구분하는 데 문제가있었습니다. 파이썬에서 인스턴스와 같은 속성을 부울 값으로 평가할 수 있다는 사실을 잊어 버렸습니다. 더 까다로운 언어로 작업하는 데 시간이 너무 많이 걸립니다. – RyanM