Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在django模型中将html类设置为TextField_Django_Python 3.x - Fatal编程技术网

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

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

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

这是my 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

您需要创建一个表单:

class MyModelAdminForm(forms.ModelForm):
    class Meta:
        fields = '__all__'
        model = Post
        widgets = {
            'yourfieldname': forms.Textarea(attrs={'class': 'your-class'})
        }
现在将其添加到您的模型管理员:

class PostModelAdmin(admin.ModelAdmin):
    form = MyModelAdminForm

您的代码就快到了,只有几件事:

  • 嵌套的
    Media
    类应该在表单或小部件上,而不是在模型上
  • 如果您总是希望在多个位置使用相同的CSS类,那么可以将其封装在一个小部件中
要覆盖管理员使用的表单行为,您有两个主要选项:

  • 像在另一个答案中一样设置
    表单
    类属性,但是必须实现表单
  • 覆盖某个模型字段的默认小部件,这样您只需编写一次小部件
以下是小部件代码:

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\u覆盖

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