【问题标题】:How can I get the Django admin's "View on site" link to work?如何让 Django 管理员的“现场查看”链接正常工作?
【发布时间】:2010-10-29 01:17:12
【问题描述】:

我使用 Django 应用程序已经有一段时间了,Django 管理界面运行良好,除了“现场查看”链接不起作用。每当我尝试使用它时,我都会收到一个带有消息的OperationalErrorno such table: django_site。我已经对此问题进行了一些研究,看来我必须设置Django sites framework 才能使此链接正常工作,但我完全确定该怎么做。该文档讨论了数据库表等,但没有说明如何实际设置站点。所以我的问题实际上是双重的:

  1. 如何设置站点框架?我是否必须自己创建表(并自己输入数据),还是我必须启用某些功能,以便 ./manage.py syncdb 自动“检测”我想要设置表?
  2. 当我在本地开发时,设置站点框架会影响我吗(即,只在本地主机上运行,​​而不是在我的实际域名上运行)?我是否必须向settings.py 添加一些内容,例如SITE_ID = 2 if DEBUG else 1,或者manage.py 只是检测到我在调试站点上工作而不对站点框架做任何事情?

【问题讨论】:

    标签: django django-admin django-sites


    【解决方案1】:

    在您的模型上定义 get_absolute_url。管理员使用该方法来确定如何构造对象 url。见the docs

    【讨论】:

    • 仅此一项是行不通的(我已经这样做了,因为我有一个 RSS 提要)。
    • 就 Django 1.7.6 而言,这是合适的方法。
    • 两者都是必需的。必须有人结合mikuArthur Debert 的答案才能使现场查看工作!
    【解决方案2】:

    放置

    'django.contrib.sites',
    

    进入您的 INSTALLED_APPS 和以下

    $ ./manage.py syncdb
    

    可能就足够了。

    安装后,编辑站点实例(例如通过/admin 接口)以反映您的本地主机名(例如localhost:8000)。

    【讨论】:

    • 成功了,尽管我添加了两个站点条目,一个用于生产站点(“真实”域名),另一个用于 localhost;然后,在 settings.py 中,如果不是 DEBUG,则我将 SITE_ID = 1,否则 2,其中 1 = 生产,2 = localhost 在站点表中。这样,管理站点既可以在本地运行,也可以在生产服务器上运行。
    • @mipadi 你把这两个条目放到夹具中了吗?
    【解决方案3】:

    正如其他人所说,除了启用 view_on_site 之外,这还需要几个额外的步骤。您必须在模型中实现 get_absolute_url(),并在项目设置中启用站点。

    设置 view_on_site 设置

    将 view_on_site 设置添加到管理表单:

    class MymodelAdmin(admin.ModelAdmin):
        ...
        view_on_site = True
    ...
    admin.site.register(Mymodel, MymodelAdmin)
    

    实现 get_absolute_url()

    get_absolute_url() 添加到您的模型中。 在models.py中:

    Mymodel(models.Model):
        ...
        def get_absolute_url(self):
            return "/mystuff/%i" % self.id
    

    启用网站

    在 yourapp/settings.py 中添加站点:

    INSTALLED_APPS = (
        ...
        'django.contrib.sites',
        ...
    )
    

    然后更新数据库:

    $ python manage.py migrate
    

    完成!

    查看reverse() 了解在 get_absolute_url() 中生成路径的更复杂的方法。

    【讨论】:

    • 只要确保您的“网站”网址正确
    【解决方案4】:

    当您在 settings.py 中编辑了 SITE_ID 或管理员认为的站点实例时,不要忘记重新启动您的网络服务器以使更改生效。

    【讨论】:

      【解决方案5】:

      在我看来,站点功能的视图仅在 get_absolute_url 引用 Django 视图时才有效。如果您尝试创建一个链接,它似乎不起作用,该链接重定向到 Django 无法控制的页面(即使它是由 apache 本身从同一个域提供的)。

      在这种情况下,很容易通过覆盖 admin tempale 手动创建按钮,如下所示:

      {% extends "admin/change_form.html" %}
      {% block object-tools-items %}
      {{ block.super }}
        <li>
          <a class="viewsitelink" href="{{ original.get_absolute_url }}">View on my site, out of Django's control</a>
        </li>
      {% endblock %}
      

      另外,将view_on_site = False 添加到您的ModelAdmin 类中,否则这两个按钮都会出现。

      【讨论】:

        【解决方案6】:

        根据 Django 文档,从 Django 3.1(2020 年 5 月)开始,您必须在模型中定义 get_absolute_url() 方法。

        Django 使用 get_absolute_url() 的一个地方是 管理应用程序。如果 对象定义了这个方法,对象编辑页面会有一个“视图 在现场”链接,将直接跳转到对象的公共视图, 由 get_absolute_url() 给出。

        这是文档中的一个示例:

        def get_absolute_url(self):
                from django.urls import reverse
                return reverse('people.views.details', args=[str(self.id)])
        

        来源:https://docs.djangoproject.com/en/3.1/ref/models/instances/#get-absolute-url

        【讨论】:

          猜你喜欢
          • 2012-04-30
          • 2012-01-25
          • 1970-01-01
          • 2012-01-29
          • 2021-07-21
          • 1970-01-01
          • 1970-01-01
          • 2019-12-06
          • 2011-10-03
          相关资源
          最近更新 更多