Django: как скрыть/перезаписать метку по умолчанию с помощью ModelForm?
У меня есть следующее, но почему это не скрывает ярлык для комментариев к книге? Я получаю сообщение об ошибке "текстовое поле" не определено:
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={''}),}
Ответы
Ответ 1
Чтобы развернуть мой комментарий выше, для форм не существует TextField. Это то, что вам сообщает об ошибке TextField. Нет никакого смысла беспокоиться о ярлыке, пока у вас не будет допустимого поля формы.
Решение состоит в том, чтобы использовать forms.CharField вместо этого с помощью виджета Textarea. Вы можете использовать опцию виджета формы модели, но проще задать виджет при определении поля.
Как только у вас есть допустимое поле, вы уже знаете, как установить пустую метку: просто используйте метку = '' в определении поля.
# 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',)
Ответ 2
Если вы используете Django 1.6+, в мета-класс ModelForm добавлен ряд новых переопределений, включая метки и field_classes
.
Смотрите: https://docs.djangoproject.com/en/1.10/topics/forms/modelforms/#overriding-the-default-fields
Ответ 3
Чтобы переопределить только метку, которую вы можете сделать
def __init__(self, *args, **kwargs):
super(ModelForm, self).__init__(*args, **kwargs)
self.fields['my_field_name'].label = 'My New Title'
Ответ 4
Атрибут exclude
принимает итерируемый (обычно список или кортеж). Но ('book')
не является кортежем; вам нужно добавить запятую, чтобы сделать ее кортежем из-за причуды синтаксиса Python: exclude = ('book',)
.
По этой причине я обычно просто использую списки: exclude = ['book']
. (Семантически, имеет смысл использовать списки здесь в любом случае, я не уверен, почему документация Django поощряет использование кортежей вместо этого.)
Ответ 5
Во-первых, вы помещаете поле в класс Meta
. Он должен перейти к фактическому ModelForm
. Во-вторых, это не будет иметь желаемого результата. Он просто напечатает пустой элемент метки в HTML.
Если вы хотите полностью удалить ярлык, либо вручную проверьте поле и не показывайте метку:
{% for field in form %}
{% if field.name != 'book_comment' %}
{{ field.label }}
{% endif %}
{{ field }}
{% endfor %}
Или используйте JavaScript для его удаления.
Ответ 6
Нашли простое решение ниже: 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'),
}