【问题标题】:Using external links inside django admin to create or update使用 django admin 内部的外部链接来创建或更新
【发布时间】:2017-03-27 21:37:06
【问题描述】:

我正在使用redactor wysiwyg editor 来编写我的内容。该页面只有所见即所得的编辑器和一个保存按钮。

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。

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 面板中可能会列出已写入的内容:

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

现在它显示列表,当我单击添加或内容时,它仅显示在管理面板内。我如何实现我想要的?您的帮助和指导真的很受欢迎。谢谢。

【问题讨论】:

    标签: django django-templates django-admin


    【解决方案1】:

    一种方法是劫持管理员网址,并为这些网址使用您自己的视图,即管理员网址不会改变,但您的编辑器页面视图将被调用而不是默认值管理员视图。 (Documentation, Source)

    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
    

    【讨论】:

      【解决方案2】:

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

      正如 jatinderjit 提到的,“劫持”管理 url 是必要的。然而, 这可以在urls.py 内以简单的方式完成。通过包含一个匹配管理 url before 的 url,我们包含了管理 url,我们可以保证重定向到我们的自定义视图将首先匹配。使用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...
      ]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-24
        • 1970-01-01
        • 2020-06-08
        • 2016-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-19
        相关资源
        最近更新 更多