使用django admin中的外部链接来创建或更新

时间:2016-11-14 09:33:32

标签: django django-templates django-admin

我使用redactor wysiwyg editor来撰写我的内容。该页面只有wysiwyg编辑器和保存按钮。

HTML:

<div id="editor-wrapper">
    <input type="text" id="editor-title" {%if blog %} value="{{blog.title}}" {% else %} placeholder="Your title" {% endif %}>
    <textarea id="editor-redactor" name="content">
        {% if blog %}
            {{ blog.body }}
        {% else %}
            <p>Enter you body in here...</p>
        {% endif %}
    </textarea>
    <button id="save-btn"><a href="/save-blog/">Save</a> </button>
</div>

在urls.py中,我添加了要转到该页面的网址。

url(r'^add-update-blog/$', views.add_update_blog),
url(r'^add-update-blog/save/(?P<blog_id>\d+)$', views.add_update_blog),

views.py:

def add_update_blog(request):
    return render(request, 'editor.html')

def add_update_blog_save(request, blog_id):
    blog = Blog.objects.get(id=blog_id)
    return render(request, 'editor.html', {
        blog: blog
    })

现在,在django-admin面板中可能有已写入内容的列表:

  • 如果我点击添加,我想转到编辑页面。
  • 如果我点击任何已编写的内容对象,我想获取该对象并将其加载到编辑器页面中。

现在它显示列表,当我单击添加或内容时,它仅显示在管理面板中。我如何实现我想要的目标?你的帮助和指导非常非常重要。谢谢。

2 个答案:

答案 0 :(得分:0)

一种方法是劫持管理网址,并对这些网址使用您自己的视图,即管理网址不会更改,但会调用您的编辑器页面视图而不是默认管理员观点。 (DocumentationSource

from .views import add_update_blog, add_update_blog_save

class BlogAdmin(admin.ModelAdmin):
    def get_urls(self):
        urls = super(BlogAdmin, self).get_urls()
        new_urls = [
             url(r'^add/$', add_update_blog),
             url(r'^(?P<blog_id>\d+)/change/$', add_update_blog_save),
        ]
        return new_urls + urls    # new_urls have to be first

答案 1 :(得分:0)

首先,您的问题可能是由于网址末尾丢失(或额外)的斜杠造成的。您的add-update-blog网址需要一个尾部斜杠,而如果有一个尾部斜杠则save网址不匹配。您可以使用正则表达式语法/?使斜杠可选,如下面的示例所示。值得注意的是,Django管理员网址仅在有斜杠时匹配。

正如jatinderjit所说,“劫持”管理员网址是必要的。然而, 这可以在urls.py内以简单的方式完成。通过在之前添加与管理网址匹配的网址,我们可以保证我们可以保证重定向到我们的自定义视图。这可以通过RedirectViewnamed url patterns轻松完成,它会将您的blog_id参数传递给您已编写的视图。

''' Snippet of urls.py'''
from django.conf.urls import include, url
from django.contrib import admin
from django.views.generic.base import RedirectView

urlpatterns = [
    # Put this before the admin include so that it is found first.
    # Don't forget to replace 'app-label' and 'blog' with the
    # appropriate names, if different.
    url(r'^admin/app-label/blog/(?P<blog_id>\d+)/?$',
        RedirectView.as_view(pattern_name='edit_blog',
                             permanent=False)),
    # The actual admin urls.
    url(r'^admin/', include(admin.site.urls)),
    # The urls to redirect to. Note that naming them makes
    # redirecting much easier.
    url(r'^add-update-blog/?$',
        views.add_update_blog,
        name='add_blog'),
    url(r'^add-update-blog/save/(?P<blog_id>\d+)/?$',
        views.add_update_blog,
        name='edit_blog'),
    # All your other urls...
]