2017-12-01 7 views
0

아주 기본적인 점을 놓치고 싶지만 해결할 수 없습니다.Django ModelForm에서 사용자 정의 필드를 추가하고 초기화하십시오.

class Person(models.Model): 
    first_name = models.CharField(max_length=256, blank=True) 
    # this is weird field, but needed for my usecase 
    last_name = models.WeirdCustomField(max_length=256, blank=True) 

그리고 나는 조금을 사용자 정의하려는이를위한 양식 (댓글)이 :

class PersonForm(forms.ModelForm): 

    class Meta: 
     model = Address 
     # I want to override 'last_name' field, so exclude it here 
     exclude = ['last_name'] 

    # And add additional field 
    my_field = ChoiceField(choices=list_of_choicec) 
    last_name = forms.CharField() 

    def __init__(self, *args, **kwargs): 
     last_name = kwargs.pop('last_name', None) 
     my_field = kwargs.pop('my_field', None) 
     super(PersonForm, self).__init__(*args, **kwargs) 
     self.fields['last_name'] = last_name 
     self.fields['my_field'] = my_field 

shell에 지금
의 내가 이와 같은 모델을 가지고 있다고 가정 해 봅시다 (모든 수입 후 ...)

person = Person.objects.get(first_name='Jacob') 
person.first_name # Prints 'Jacob', correct! 
form = PersonForm(instance=person, last_name='Smith', my_field='test123') 
form['first_name'].value() # -> 'Jacob', that's right 
form['last_name'].value() # -> nothing, I expected 'Smith' 
form['my_field'].value() # -> nothing, I would like to see 'test123' 

나는 인터넷을 매우 깊이 파고 있지만 이런 종류의 문제에 대한 해결책을 찾지 못했습니다.

답변

1

초기 값을 설정해야합니다. init에서 아래 코드로 바꾸십시오.

self.fields['last_name'].initial = last_name 
self.fields['my_field'].initial = my_field 

양식 인스턴스를 만들 때 초기 값을 전달할 수도 있습니다.

form = PersonForm(instance=person, initial={'last_name'='Smith', 'my_field'='test123'}) 

이 방법을 사용하는 것이 좋습니다. init 메소드를 전혀 오버라이드 할 필요가 없다.

+0

놀라운, 가까운 장래에 나 자신을 알아낼 것이라고 생각하지 않습니다. 감사합니다! 나는 또한 직설적으로 반박하는 말을 할 필요가있다. 그러나 나는 이것이 프레임 워크 방식이라고 생각한다. –

+0

init에 self.fields [ 'my_field']를 인쇄 해보십시오. 그것이 무엇인지 알 수 있습니다. –