Django:如何使用ModelForm隐藏/覆盖默认标签?

时间:2012-02-17 17:18:17

标签: python django label hide 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={''}),}  

6 个答案:

答案 0 :(得分:17)

要扩展我上面的评论,表单上没有TextField。这就是TextField错误告诉你的内容。在您拥有有效的表单字段之前,没有必要担心标签。

解决方案是使用forms.CharField,使用Textarea小部件。您可以使用模型表单窗口小部件选项,但在定义字段时设置窗口小部件更简单。

获得有效字段后,您已经知道如何设置空白标签:只需在字段定义中使用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',)

答案 1 :(得分:9)

如果您正在使用Django 1.6+,则会在ModelForm的元类中添加一些新的覆盖,包括标签和field_classes

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

答案 2 :(得分:5)

仅覆盖您可以执行的标签

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

答案 3 :(得分:1)

exclude属性采用可迭代(通常是列表或元组)。但是('book')不是一个元组;由于Python语法的怪癖,你需要附加一个逗号来使其成为一个元组:exclude = ('book',)

出于这个原因,我通常只使用列表:exclude = ['book']。 (从语义上讲,无论如何在这里使用列表更有意义;我不确定为什么Django的文档会鼓励使用元组。)

答案 4 :(得分:0)

首先,您将字段放在Meta类中。它需要继续实际ModelForm。其次,无论如何都不会产生预期的结果。它只会在HTML中打印一个空的标签元素。

如果要完全删除标签,请手动检查字段,不要显示标签:

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

或使用JavaScript将其删除。

答案 5 :(得分:0)

在下面找到了一个简单的解决方案: 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'),
    }