如何获得Django管理员';s";“现场查看”;链接到工作?

如何获得Django管理员';s";“现场查看”;链接到工作?,django,django-admin,django-sites,Django,Django Admin,Django Sites,我使用Django应用已经有一段时间了,Django管理界面工作得很好,只是“查看站点”链接不起作用。每当我尝试使用它时,就会出现一个操作错误,消息是:没有这样的表:django_site。我对这个问题做了一些研究,似乎我必须为这个链接设置一个链接,但我完全确定如何做到这一点。文档讨论了数据库表等,但没有说明如何实际设置站点。所以我的问题有两个方面: 如何设置站点框架?我必须自己创建表(并自己输入数据),还是必须启用某些功能,以便/manage.py syncdb自动“检测”我想要设置表 当我在

我使用Django应用已经有一段时间了,Django管理界面工作得很好,只是“查看站点”链接不起作用。每当我尝试使用它时,就会出现一个
操作错误
,消息是:
没有这样的表:django_site
。我对这个问题做了一些研究,似乎我必须为这个链接设置一个链接,但我完全确定如何做到这一点。文档讨论了数据库表等,但没有说明如何实际设置站点。所以我的问题有两个方面:

  • 如何设置站点框架?我必须自己创建表(并自己输入数据),还是必须启用某些功能,以便
    /manage.py syncdb
    自动“检测”我想要设置表
  • 当我在本地开发时(即,只在本地主机上运行,而不是在我的实际域名上运行),设置站点框架会影响我吗?如果DEBUG else 1,我是否必须向
    settings.py
    添加类似
    SITE\u ID=2的内容,或者
    manage.py
    只检测到我正在调试站点,而不使用站点框架
  • 放置

    'django.contrib.sites',
    
    进入您已安装的应用程序和以下内容

    $ ./manage.py syncdb
    
    也许就够了


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

    在您的模型上定义
    获取绝对url
    。管理员使用该方法确定如何构造对象url。请参阅。

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

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

    设置“在站点上查看”设置 将查看站点设置添加到管理表单:

    class MymodelAdmin(admin.ModelAdmin):
        ...
        view_on_site = True
    ...
    admin.site.register(Mymodel, MymodelAdmin)
    
    实现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
    
    完成!
    查看get_absolute_url()中生成路径的更复杂方法。

    在我看来,只有当
    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 %}
    
    {%extends“admin/change\u form.html”%}
    {%block object tools items%}
    {{block.super}}
    
  • {%endblock%}

    另外,将
    view\u on\u site=False
    添加到
    ModelAdmin
    类中,否则两个按钮都会出现。

    根据Django文档,从Django 3.1(2020年5月)开始,您必须在模型中定义get\u absolute\u 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)])
    

    来源:

    这就成功了,尽管我添加了两个站点条目,一个用于生产站点(“真实”域名),另一个用于localhost;然后,在settings.py中,我将SITE_ID=1(如果不是DEBUG else 2),其中1=production,2=localhost放在sites表中。这样,管理站点既可以在本地工作,也可以在生产服务器上工作。@mipadi您是否将这两个条目放入fixture?仅此一项并不能完成工作(我已经这样做了,因为我有一个RSS提要)。就Django 1.7.6而言,这是合适的方法。这两种方法都是必需的。必须有人将miku和Arthur Debert的答案结合起来,才能在网站上进行查看!只要确保你的“站点”url是正确的