Django在实时网站上编辑静态内容

时间:2015-12-06 06:46:18

标签: html css django

我很难解决如何在Django中以特权用户身份登录网站来编辑实时网站上的html和css(如果可以在Flask中使用,我可以使用它)。例如,修改页面上使用的背景图像。 ckeditor允许您对模型字段执行此操作:

class Post(models.Model):
    content = RichTextField()

但不适用于静态html或css。人们通常如何做到这一点 - 在测试机器上进行所有更改,将.html和css推送到实际网站?理想情况下,我希望设计人员能够使用wysiwyg工具登录和修改网站,而无需开发人员。

1 个答案:

答案 0 :(得分:1)

如果你想实现网站的布局文件的编辑,就像Wordpress为主题做的那样,你将需要实现一个应用程序来自己做,我不知道任何现有的项目,允许你在Django或Flask中这样做。

简而言之,您需要选择要公开的文件,并在视图中加载文本文件open(file),将其显示在textarea中的Django表单中,然后将其保存回来该文件再次。

如果您正在编辑css文件,则根据您的设置,您可能需要在表单保存上触发collectstatic命令,以便文件转到需要的位置。

您还可以使用Ace Editor来简化代码编辑。

这是我在之前项目中用于实现此目的的一个精简示例:

  class EditFileView(FormView):
    template_name = "file_edit_form.html"
    form_class = EditFileForm

    ALLOWED_ROOTS = ["%s/" % DISPLAY_TEMPLATES_DIRECTORY, ]

    def get_allowed_roots(self):
        return self.ALLOWED_ROOTS

    def dispatch(self, request, *args, **kwargs):
        if "file_name" not in request.GET:
            raise Http404

        file_name = request.GET['file_name']

        exists = False
        for root in self.get_allowed_roots():
            exists = os.path.exists(os.path.join(root, file_name))
            if exists:
                self.file_path = os.path.join(root, file_name)
                self.file_name = file_name
                self.root = root
                break

        if not exists:
            logger.debug(u"EditFileView: Could not find file to edit - %s" % file_name)
            raise Http404()

        return super(EditFileView, self).dispatch(request, *args, **kwargs)

    def form_valid(self, form):
        try:
            f = open(self.file_path, "wt")
            f.write(form.cleaned_data['file_contents'])
            f.close()
        except Exception, e:
            pass

        return HttpResponseRedirect(self.get_success_url())

    def get_initial(self):
        initial = super(EditFileView, self).get_initial()
        with open("%s" % self.file_path, "r") as f:
            initial['file_contents'] = f.read()
        initial["file_path"] = self.file_path
        return initial

    def get_success_url(self):
        return reverse("edit_file") + "?file_name=%s" % self.file_name


    def get_context_data(self, **kwargs):
        current = super(EditFileView, self).get_context_data(**kwargs)
        current.update({"file_name": self.file_path[len(self.root):].replace("//", "/")})
        return current