【问题标题】:Django: how to hide/overwrite default label with ModelForm?Django:如何使用 ModelForm 隐藏/覆盖默认标签?
【发布时间】:2012-03-09 02:41:02
【问题描述】:

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

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

【问题讨论】:

  • 可能不隐藏,而是把标签改成nothing?
  • 你导入forms.TextField了吗?
  • 我没有,我只有 from django.forms import ModelForm, Textarea。当我尝试添加“,TextField”时出现导入错误...
  • 糟糕。没有forms.TextField。使用带有 Textarea 小部件的 forms.CharField。
  • 这让我抓狂,正确的语法是什么?有谁知道如何简单地替换默认标签??

标签: python django label hide modelform


【解决方案1】:

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

【讨论】:

    【解决方案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】:

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

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

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

        【讨论】:

          【解决方案5】:

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

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

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

          或使用 JavaScript 将其删除。

          【讨论】:

            【解决方案6】:

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

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

            【讨论】:

            • 我相信 Django 的文档推荐元组,因为由于排除值不会改变,所以没有必要有一个列表(它是可变的)。由于该可变属性,列表比元组大。 a = ('a',), b = ['a'] 然后使用 __ sizeof __ 方法并检查大小;-)
            • 我只希望标签为空白,我完全按照文档进行操作,并且能够覆盖默认标签...
            • @markuz:我认为是这样,但我仍然认为这是错误的,因为元组不仅仅是不可变的列表。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-11-13
            • 2021-06-09
            • 2011-02-25
            • 1970-01-01
            • 2016-03-20
            • 2015-03-15
            • 1970-01-01
            相关资源
            最近更新 更多