Django: как скрыть / перезаписать метку по умолчанию с помощью ModelForm? - PullRequest
12 голосов
/ 17 февраля 2012

У меня есть следующее, но почему это не скрывает ярлык для комментария книги?Я получаю сообщение об ошибке "текстовое поле" не определено:

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

Ответы [ 6 ]

17 голосов
/ 17 февраля 2012

Чтобы расширить мой комментарий выше, для форм нет 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',)
9 голосов
/ 31 декабря 2013

Если вы используете Django 1.6+, в мета-класс ModelForm было добавлено несколько новых переопределений, включая метки и field_classes.

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

6 голосов
/ 10 декабря 2015

Чтобы переопределить только метку, которую вы можете сделать

def __init__(self, *args, **kwargs): 
    super(ModelForm, self).__init__(*args, **kwargs)
    self.fields['my_field_name'].label = 'My New Title'
1 голос
/ 17 февраля 2012

Атрибут exclude принимает итерацию (обычно список или кортеж).Но ('book') не является кортежем;вам нужно добавить запятую, чтобы сделать его кортежем из-за причуды синтаксиса Python: exclude = ('book',).

По этой причине я обычно просто использую списки: exclude = ['book'].(Семантически, в любом случае имеет смысл использовать здесь списки; я не уверен, почему документация Django поощряет использование кортежей вместо этого.)

0 голосов
/ 20 апреля 2019

Нашли простое решение ниже: 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 голосов
/ 17 февраля 2012

Прежде всего, вы помещаете поле в класс Meta.Это должно идти на фактический ModelForm.Во-вторых, это не даст желаемого результата в любом случае.Он просто напечатает пустой элемент метки в HTML.

Если вы хотите полностью удалить метку, либо вручную проверьте поле и не показывайте метку:

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

Или используйте JavaScript, чтобы удалить его.

...