2012-08-07 2 views
3

양식 세트를 사용하여 다른 양식을 표시하는 페이지가 있습니다. django의 formset에있는 양식에서 라디오 버튼 사용

이들은

내 모델입니다 :

class Phone(models.Model): 
    mac = models.CharField() 

class PhoneLine(models.Model): 
    phone = models.ForeignKey(Phone) 
    voicemail = models.BooleanField("Voice Mail", default=False) 

전화는 많은 선 (전화선)을 가질 수 있지만 단 하나의 전화 회선은 음성 메일을 사용할 수 있습니다. I는 해당 formset를 사용 phonelines 표시 기본적

다음과 같이 체크 박스로의 음성 메일 필드 디스플레이. (I 요구 사항에 기초하여, 해당 formset에 프리픽스를 추가)

form1 of the formset 
<input type="checkbox" name="phone_client_line_1-0-voicemail" id="id_phone_client_line_1-0-voicemail"> 

form2 of the formset 
<input type="checkbox" name="phone_client_line_1-1-voicemail" id="id_phone_client_line_1-1-voicemail"> 

합니다 (검사 및 UN 체크 박스의 -checking이 스레드, Django - Show BooleanField in a formset as one group of radio buttons을 기반으로 백엔드)

를 업데이트, 지금은 라디오 버튼과 음성 메일 필드를 표시하기 위해 내 전화선 양식의 초기화 및 add_prefix 방법 ..

수정

form1 of the formset 
<input type="radio" id="id_voicemail_1_0" value="phone_client_line_1-0-voicemail" name="voicemail_1"> 

form2 of the formset 
<input type="radio" id="id_voicemail_1_0" value="phone_client_line_1-1-voicemail" name="voicemail_1"> 

보시다시피, 지금은 라디오 필드 voicemail_1을 위해, 내가 선택한 전화선의 값이 :

class PhoneLineForm(ModelForm): 

def __init__ (self, *args, **kwargs): 
    super(PhoneLineForm, self).__init__(*args, **kwargs) 
    self.fields['voicemail'] = BooleanField(widget = RadioSelect(choices=((self.prefix+"-"+str("voicemail"), 'Voicemail LIne'),))) 

def add_prefix(self, field): 
    if field == 'voicemail': return ('%s_%s') %(field, self.instance.phone.id) 
    else: return self.prefix and ('%s-%s' % (self.prefix, field)) or field 

이 다음과 HTML 출력을 수정합니다. 이 양식을 제출하면 voicemail_1 라디오를 선택하면 데이터베이스가 업데이트되지 않습니다.

제출시 선택한 전화선의 값을 어떻게 캡처 할 수 있습니까? phonelineform의 save 메소드를 덮어 쓰면 contatin이 무엇이겠습니까?

이 부분에 대한 모든 의견을 환영합니다. 감사!!

답변

1

실제로 JavaScript를 사용하면 JavaScript를 사용하지 않아도 음성 메일이있는 전화선이 두 개 이상 선택되면 서버 쪽의 유효성을 검사하고 메시지를 표시 할 수 있습니다.).

이것은 필드 이름과 값을 해킹하려는 것보다 간단합니다. Django formsets는 최고의 시간에 논쟁하기에 힘든 짐입니다. 따라서 서버 측의 복잡성을 추가하는 것은 특히 문제가 해결 될 수있는 경우에는 종종 번거롭지 않습니다. - 사소한 jQuery 작업을 통해 .

$('input[name^="voicemail_"]').on('click', 
    function() { 
     $('input[name^="voicemail_"]').not($(this)).prop('checked', false); 
    } 
); 

대략적인 제안. 유용하길 바래.