【问题标题】:set html class to TextField in django model在 Django 模型中将 html 类设置为 TextField
【发布时间】:2019-03-06 09:07:18
【问题描述】:

我想将模型中的 TextField 更改为 TinyMCE RichTextEditor。我已经下载了tinymce 4.8.3开发包并定制了它。然后我将 tinymce 文件粘贴到 staticfiles 目录。据我了解,为了让一切正常工作,我必须为视图页面上的 元素分配一个 HTML 类。 它是如何在本地 html 文件上工作的。我已经尝试了几乎所有通过 pip 安装的应用程序(django-tinymce、django-tinymce4-lite 等)。我仍然想为自己调整这个富文本编辑器。富文本编辑器必须出现在管理页面上。

这是我的models.py:

class Post(models.Model):
    title = models.CharField(max_length=150)
    content = models.TextField()
    created = models.DateTimeField(auto_now_add=True)
    tags = TaggableManager(blank=True)

    class Media:
        js = ('js/init-tinymce.js', 'js/tinymce/tinymce.js',)

admin.py:

class PostModelAdmin(admin.ModelAdmin):
    list_display = ["title", "created"]
    list_display_links = ["title"]
    list_filter = ["created", "tags"]
    search_fields = ["title", "content",]
    class Meta:
        model = Post

admin.site.register(Post, PostModelAdmin)

如果我的理解有所不同,请向我解释。我使用 Django 2.0.8 和 python 3.6。在网上,我找到了如何设置一个像这种形式的类,但我无法将它添加到我的项目中。

class MyTextForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(MyTextForm, self).__init__(*args, **kwargs)
        self.fields['content'].widget.attrs['class'] = 'tinymce'

    class Meta:
        model = Post
        fields = ('content')  # your fields here

【问题讨论】:

    标签: django python-3.x


    【解决方案1】:

    你需要创建一个表单:

    class MyModelAdminForm(forms.ModelForm):
        class Meta:
            fields = '__all__'
            model = Post
            widgets = {
                'yourfieldname': forms.Textarea(attrs={'class': 'your-class'})
            }
    

    现在将它添加到您的模型管理员中:

    class PostModelAdmin(admin.ModelAdmin):
        form = MyModelAdminForm
    

    【讨论】:

      【解决方案2】:

      你的代码就差不多了,只有几件事:

      • 嵌套的Media 类应该在表单或小部件上,而不是在模型上
      • 如果您总是希望在多个地方使用相同的 CSS 类,您可以将其全部封装在一个 Widget 中

      要覆盖管理员使用的表单的行为,您有两个主要选项:

      • 像其他答案一样设置form 类属性,但您必须实现表单
      • 覆盖特定模型字段using formfield_overrides的默认小部件,这样您只需编写一次小部件。

      这是小部件代码:

      class AdminTinyMceWidget(AdminTextareaWidget):
          class Media:
              js = ('js/init-tinymce.js', 'js/tinymce/tinymce.js',)
      
          def __init__(self, attrs=None):
              if attrs is None:
                  attrs = {'class': 'your-class'}
              super().__init__(attrs)
      

      还有模型管理员设置formfield_overrides

      class PostModelAdmin(admin.ModelAdmin):
          formfield_overrides = {
              models.TextField: {'widget': AdminTinyMceWidget()},
          }
      

      【讨论】:

        猜你喜欢
        • 2011-09-26
        • 2018-02-05
        • 2020-10-09
        • 2014-09-17
        • 1970-01-01
        • 2015-10-10
        • 2020-12-10
        • 2012-02-02
        • 2019-10-24
        相关资源
        最近更新 更多