フォームセットを使用してさまざまなフォームを表示するページがあります。
これらは私のモデルです:
class Phone(models.Model):
mac = models.CharField()
class PhoneLine(models.Model):
phone = models.ForeignKey(Phone)
voicemail = models.BooleanField("Voice Mail", default=False)
電話には複数の回線 (電話回線) を設定できますが、ボイス メールを有効にできるのは 1 つの電話回線だけです。
デフォルトでは、formset を使用して電話回線を表示すると、ボイス メール フィールドは次のようにチェック ボックスとして表示されます (要件に基づいて、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">
(チェックボックスのチェックとチェック解除により、バックエンドが更新されます)
このスレッドDjango - Show BooleanField in a formset as one group of radio buttonsに基づいて、電話回線フォームのinitおよび add_prefix メソッドを変更して、ボイスメール フィールドをラジオ ボタンとして表示するようにしました。
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 出力が次のように変更されます。
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 には、選択した電話回線の値があります。このフォームを送信すると、voicemail_1 ラジオを選択した後、データベースが更新されません。
送信時に選択された電話回線の値を取得するにはどうすればよいですか?. phonelineform の save メソッドを上書きすると、何を含めればよいでしょうか?
これに関する任意のポインタをいただければ幸いです。ありがとう!!