5

フォームセットを使用してさまざまなフォームを表示するページがあります。

これらは私のモデルです:

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 メソッドを上書きすると、何を含めればよいでしょうか?

これに関する任意のポインタをいただければ幸いです。ありがとう!!

4

1 に答える 1

2

実際には、これを簡素化し、JavaScript に依存することをお勧めします (JavaScript が有効になっていないため、ボイスメールで複数の電話回線を選択した場合は、いつでもサーバー側を検証してユーザーにメッセージを表示できます)。

これは、フィールド名と値をハッキングしようとするよりも簡単です。Django フォームセットは、最高の状態で論争するのに十分なほど難しい獣であるため、サーバー側の複雑さをさらに追加することは、多くの場合、手間をかける価値がありません。 .

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

大雑把な提案です。それが役に立つことを願っています。

于 2015-10-16T23:32:10.993 に答える