web-dev-qa-db-ja.com

Django:ModelFormでデフォルトのラベルを非表示/上書きする方法は?

私は以下を持っていますが、なぜこれが本のコメントのラベルを隠さないのですか? 「textfield」が定義されていませんというエラーが表示されます。

from Django.db import models
from Django.forms import ModelForm, Textarea

class Booklog(models.Model):
    Author = models.ForeignKey(Author)
    Book_comment = models.TextField()
    Bookcomment_date = models.DateTimeField(auto_now=True)

class BooklogForm(ModelForm):
    #book_comment = TextField(label='')

    class Meta:
        model = Booklog
        exclude = ('Author')
        widgets = {'book_entry': Textarea(attrs={'cols': 45, 'rows': 5}, label={''}),}  
14
thedeepfield

上記の私のコメントを拡張するために、フォーム用のTextFieldはありません。それはあなたのTextFieldエラーがあなたに言っていることです。有効なフォームフィールドができるまで、ラベルについて心配する必要はありません。

解決策は、Textareaウィジェットで代わりにforms.CharFieldを使用することです。モデルフォームウィジェットオプションを使用することもできますが、フィールドを定義するときにウィジェットを設定する方が簡単です。

有効なフィールドができたら、空白のラベルを設定する方法をすでに知っています。フィールド定義でlabel = ''を使用するだけです。

# I prefer to importing Django.forms
# but import the fields etc individually
# if you prefer 
from Django import forms

class BooklogForm(forms.ModelForm):
    book_comment = forms.CharField(widget=forms.Textarea, label='')

    class Meta: 
        model = Booklog
        exclude = ('Author',)
18
Alasdair

Django 1.6+を使用している場合、ラベルやfield_classesなど、多数の新しいオーバーライドがModelFormのメタクラスに追加されました。

参照: https://docs.djangoproject.com/en/1.10/topics/forms/modelforms/#overriding-the-default-fields

9
Alan Illing

ラベルだけを上書きするには、

def __init__(self, *args, **kwargs): 
    super(ModelForm, self).__init__(*args, **kwargs)
    self.fields['my_field_name'].label = 'My New Title'
7
Thomas Turner

exclude属性は反復可能(通常はリストまたはタプル)を取ります。ただし、_('book')_はタプルではありません。 Pythonの構文の癖のため、タプルにするにはコンマを追加する必要があります:exclude = ('book',)

このため、私は通常、リスト_exclude = ['book']_を使用します。 (意味的には、とにかくここでリストを使用する方が理にかなっています。Djangoのドキュメントが代わりにタプルの使用を推奨している理由はわかりません。)

1
mipadi

以下の簡単な解決策を見つけました: https://docs.djangoproject.com/en/1.10/topics/forms/modelforms/#overriding-the-default-fields

基本的には、ラベル辞書を追加し、フォームメタクラスに必要な新しいラベルを入力するだけです。

class AuthorForm(ModelForm):
class Meta:
    model = Author
    fields = ('name', 'title', 'birth_date')
    labels = {
        'name': _('Writer'),
    }
0
Achilles

まず、フィールドをMetaクラスに配置します。実際のModelFormに進む必要があります。第二に、それはとにかく望ましい結果をもたらさないでしょう。 HTMLに空のlabel要素を出力するだけです。

ラベルを完全に削除する場合は、手動でフィールドを確認し、ラベルを表示しないでください。

{% for field in form %}
    {% if field.name != 'book_comment' %}
    {{ field.label }}
    {% endif %}
    {{ field }}
{% endfor %}

または、JavaScriptを使用して削除します。

0
Chris Pratt