在Django模型中将html类设置为TextField

时间:2018-10-01 09:22:20

标签: django python-3.x

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

这是我的模型。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。在Internet上,我发现了如何以这种形式设置类,但无法将其添加到我的项目中。

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您所拥有的代码已经差不多了,只有几件事:

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

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

  • 像其他答案一样设置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()},
    }