Подтвердить что ты не робот

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={''}),}  
4b9b3361

Ответ 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',)

Ответ 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 для его удаления.