20

私のモデルの1つに、次のようなフィールドがあります。

 payrollProvider = models.CharField(max_length=2, choices=PAYROLL_CHOICES)
 PAYROLL_CHOICES = (
        ('C1', 'Choice1'),
        ('C2', 'Choice2')
        etc.....
                    )

このフィールドのモデルフォームを作成すると、DjangoはHTML選択ボックスを正しく生成しますが、デフォルトの空白値「---------」が含まれています。

このデフォルト値を「値を選択してください」などの他のテキストに変更する方法を教えてください。

この回答や他のいくつかの回答に記載されているように、次の方法でモデルフォームのinitにこれを設定できるはずです。

self.fields['payrollProvider'].empty_label = "please choose value"

しかし、これは私にはうまくいきません。その行をフォームの初期化に含めると、「--------」が選択ボックスの最初の選択肢として表示されます。以下に関連するforms.pyを貼り付けていますが、他の人もempty_labelにアクセス/変更できていないようです。このリンクで、質問者はデフォルトのempty_label値(彼のメソッドを介して正常に実行できました)を削除する方法を説明していますが、私が本当にやりたいのは、表示されるempty_labelを変更することです。

何か案は?

以下はforms.pyのフォームのコードで、empty_labelコードはデフォルトの「----------」の変更に成功していません。

class PayrollCredentialForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(PayrollCredentialForm, self).__init__(*args, **kwargs)
        self.fields['payrollUsername'].widget.attrs.update({'class' : 'yp-signup'})
        self.fields['payrollPassword'].widget.attrs.update({'class' : 'yp-signup'})
        self.fields['payrollProvider'].widget.attrs.update({'class' : 'yp-signup'})
        self.fields['payrollUsername'].widget.attrs.update({'placeholder' : '  Payroll Username'})
        self.fields['payrollPassword'].widget.attrs.update({'placeholder' : '  Payroll Password'})
        self.fields['payrollProvider'].empty_label = "please choose value"


class Meta:
    model = Company
    fields = ('payrollProvider', 'payrollUsername', 'payrollPassword')
    widgets = {
        'payrollPassword': forms.PasswordInput(),
    }
4

8 に答える 8

15

ドッカエビ、それは正しく動作しません。次の選択コードを受け取ります。

<select name="payrollProvider" id="id_payrollProvider">
<option value="" selected="selected">---------</option>
<option value="" selected="selected">please choose value</option>
<option value="C1">Choice1</option>
<option value="C2">Choice2</option>
</select>

私の頭に浮かんだ比較的便利な唯一の方法は、次の形式で次のようなことを行うことです。

class PayrollCredentialForm(forms.ModelForm):
    class Meta:
        model = Company
    def __init__(self, *args, **kwargs):
        super(PayrollCredentialForm, self).__init__(*args, **kwargs)
        self.fields["payrollProvider"].choices = [("", "please choose value"),] + list(self.fields["payrollProvider"].choices)[1:] 
于 2012-12-25T16:36:30.430 に答える
10

実際、現在(Django 1.8以降)の作品のオーバーライドempty_label

class PayrollCredentialForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(PayrollCredentialForm, self).__init__(*args, **kwargs)
        self.fields['payrollProvider'].empty_label = 'Please, choose value'

また、Django Adminを使用している場合は、リストビューに空の値を設定するオプションがあります。

class PayrollCredentialAdmin(admin.ModelAdmin):
    list_display = ('payrollProvider_value', )

    def payrollProvider_value(self, instance):
        return instance.payrollProvider
    payrollProvider_value.empty_value_display = 'Empty value'

フィールドが必要な場合はどうなりreadonlyますか?

このように変更されたフィールドが必要な場合は、問題がありますreadonly

オーバーライドされたフォームフィールドがクラスreadonly_fields内の属性で指定されると、例外が発生します(フィールドはフォームに含まれないため)。これを処理するには、次を使用する代わりにオーバーライドする必要があります。PayrollCredentialAdminKeyErrorPayrollCredentialFormreadonlyself.fieldsformfield_for_dbfieldreadonly_fields

def formfield_for_dbfield(self, db_field, **kwargs):
    field = super(PayrollCredentialAdmin, self).formfield_for_dbfield(
        db_field, **kwargs
    )
    db_fieldname = canonical_fieldname(db_field)

    if db_fieldname == 'payrollProvider':
        field.widget = forms.Select(attrs={
            'readonly': True, 'disabled': 'disabled',
        })

    return field

役に立つかもしれません。


Django のアップデート1.11

以下のコメントは、そのようなオーバーライドが新しいバージョンのDjangoではもはや有効ではないという仮定をもたらしました。

于 2016-11-29T14:39:25.673 に答える
8

問題は、選択フィールドのタイプに使用できないものを指定しようとしていることです。

empty_labelオプションはforms.ModelChoiceField用です。これはたまたまSelectウィジェットを使用しますが、オプションを提供しているCharFieldと同じ種類のフィールドではありません。

https://docs.djangoproject.com/en/dev/ref/forms/fields/#modelchoicefield

これは、前の質問でも確認できます:https ://stackoverflow.com/a/740011/1406860

モデルフォームのhtmlをオーバーライドして、最初のオプションを「値を選択してください」として追加することができます。または、テンプレートフィルターを使用して同じことを行うこともできます。最後に、PAYROLL_CHOICESに( ""、 "値を選択してください")と入力できます。payrollProviderなしで送信したくない場合は、モデルのフィールドにblank=Falseを設定するだけです。

JD

于 2012-10-20T01:20:40.603 に答える
2

あなたのforms.pyファイルでは、これは間違いなく機能します..これを試してください...

     class Meta:
        model = StaffDetails
        fields =['photo','email', 'first_name','school','department', 'middle_name','last_name','gender', 'is_active']
     def __init__(self, *args, **kwargs):
        super(StaffDetailsForm, self).__init__(*args, **kwargs)
        self.fields['Field_name'].empty_label = 'Please Select' 

それは私のために働いた..フィールド名をあなたのものに置き換えるだけです...

于 2017-05-26T07:03:53.537 に答える
1

ModelChoiceField(フィールド用に生成された)のみがパラメーターをForeignKeyサポートしempty_labelます。その場合、これらのフィールドは通常django.forms.models.ModelFormMetaclass、への呼び出し内で生成されるため、取得するのは困難django.forms.models.modelform_factoryです。

ModelFormMetaclassparamを使用して、表示および値としてempty_label、リストに別の選択肢を追加します。empty_label''

必要なことを行う最も簡単な方法は、選択肢リストに空の選択肢を追加することです。

PAYROLL_CHOICES = (
        ('', 'please choose value'),
        ('C1', 'Choice1'),
        ('C2', 'Choice2'),

        etc.....
                    )
于 2012-10-20T01:14:40.793 に答える
1

私のために働いたもう一つの簡単な方法は:

country = forms.ModelChoiceField(queryset=Country.objects.filter(), empty_label='--Select--')

ただし、私のDjangoバージョンは2.2.7です。

于 2020-05-24T08:36:02.110 に答える
0

Javedの回答から適応。フォームにはたくさんのフィールドがあるので、htmlのすべてのラベルをプレースホルダーに置き換えたいので、一部のタグにはフィールドラベルを使用します。

class PacienteForm(forms.ModelForm):

    class Meta:
        model=Paciente
        fields=('__all__')

    def __init__(self, *args, **kwargs):
        super(PacienteForm, self).__init__(*args, **kwargs)

        for f in self.fields:
            if hasattr(self.fields[f], 'choices'):
                choices=self.fields[f].choices
                if type(choices) == list:
                    choices[0]=('',self.fields[f].label)
                    self.fields[f].choices=choices
于 2021-08-05T09:39:14.053 に答える
0

Nonemodel.field.choicesの値でタプルを追加するだけです:

 payrollProvider = models.CharField(max_length=2, choices=PAYROLL_CHOICES)
 PAYROLL_CHOICES = (
        (None, 'please choose'),
        ('C1', 'Choice1'),
        ('C2', 'Choice2')
        etc.....
                    )

ドキュメント(v4.0)から:

デフォルトとともにblank=Falseがフィールドに設定されていない限り、「---------」を含むラベルが選択ボックスでレンダリングされます。この動作をオーバーライドするには、Noneを含む選択肢にタプルを追加します。例(なし、「表示用の文字列」)。または、CharFieldのように、これが理にかなっている場合は、Noneの代わりに空の文字列を使用できます。

于 2021-12-26T13:26:34.190 に答える