2

モデルに BooleanField が含まれ、その BooleanField に関連付けられたフォーム ウィジェットが RadioSelect ウィジェットである Django ModelForm を使用しています。レンダリングする RadioSelect ウィジェットでオプションが選択されないようにしたいので、ユーザーは明示的に選択する必要がありますが、選択しない場合はフォームの検証が失敗します。これを行う方法はありますか?

models.py

myboolean = models.BooleanField(choices=YES_NO)

フォーム.py

class myModelForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(myModelForm, self).__init__(*args, **kwargs)
        self.fields['myboolean'].widget = forms.RadioSelect(choices=YES_NO)
4

4 に答える 4

6

あなたのコードは実際に必要なことを行います。オプションが選択されていないラジオ ボタンをレンダリングし、何も選択されていない場合はエラー メッセージを生成します。

フォーム コードに関する小さなメモ。私は次のようにします:

class myModelForm(forms.ModelForm):

    myboolean = forms.BooleanField(widget=forms.RadioSelect(choices=YES_NO))

    class Meta:
        model = MyModel
于 2010-08-12T15:35:07.027 に答える
2

残念ながら、これは Django の問題ではなく、HTML の問題です。HTML 仕様 (RFC1866) には次のように書かれています。

常に、セット内のラジオ ボタンの 1 つだけがオンになっています。ラジオ ボタンのセットの <INPUT> 要素のいずれも「CHECKED」を指定しない場合、ユーザー エージェントは最初にセットの最初のラジオ ボタンをチェックする必要があります。

ただし、ブラウザは歴史的にこれを無視し、さまざまな方法でラジオ ボタンを実装してきました。

<INPUT> タグの「checked」属性がパラメーターをとらないため、HTML もこれを困難にします。そのため、この属性を False または No に設定するカスタマイズされた Django ウィジェットを使用することはできません。

考えられる回避策は、ドキュメントの onLoad イベントの一部として実行される小さな Javascript を挿入して、ページ上のすべてのラジオ ボタンを検出し、'checked' 属性を false に設定することです (たとえば、JQuery を使用)。

于 2010-08-12T16:25:40.470 に答える
1

これを参照してください: http://docs.djangoproject.com/en/dev/topics/forms/modelforms/#a-full-example

于 2010-08-12T20:51:26.367 に答える
0

デフォルトのウィジェットでカスタム フィールドを作成します。

私のmodels.pyのカット:

class Order(models.Model):
    ...
    # transport =  models.CharField(choices=transport.choices,max_length=25,null=True)
    transport = SelectField(choices=transport.choices,max_length=25,null=True)
    ...

フィールド定義:

from django.db import models
from django.forms import widgets

class SelectField(models.CharField):
    def formfield(self, **kwargs):
        if self._choices:
            defaults = {'widget': widgets.RadioSelect}
        defaults.update(kwargs)
        return super(SelectField, self).formfield(**defaults)
于 2014-03-19T09:50:31.693 に答える