14

我有以下内容,但是为什么这不隐藏书评的标签?我收到错误“文本字段”未定义:

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

6 回答 6

18

为了扩展我上面的评论,表单没有 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',)
于 2012-02-17T19:32:22.900 回答
10

如果您使用的是 Django 1.6+,则在 ModelForm 的元类中添加了许多新的覆盖,包括标签和field_classes.

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

于 2013-12-31T18:21:28.443 回答
9

要仅覆盖您可以执行的标签

def __init__(self, *args, **kwargs): 
    super(ModelForm, self).__init__(*args, **kwargs)
    self.fields['my_field_name'].label = 'My New Title'
于 2015-12-10T15:38:26.890 回答
3

在下面找到了一个简单的解决方案: 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'),
    }
于 2019-04-20T20:30:10.130 回答
1

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

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

于 2012-02-17T17:20:58.817 回答
0

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

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

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

或使用 JavaScript 将其删除。

于 2012-02-17T17:23:12.313 回答