如何让Django管理员的“在网站上查看”链接工作?

时间:2009-05-26 17:48:56

标签: django django-admin django-sites

我一直在使用Django应用程序一段时间,而Django管理界面效果很好,除了“网站上的视图”链接不起作用。每当我尝试使用它时,我都会收到OperationalError消息:no such table: django_site。我已经对这个问题进行了一些研究,似乎我必须设置Django sites framework才能使这个链接起作用,但我确定如何做到这一点。文档讨论了数据库表等,但它没有说明如何实际设置站点。所以我的问题实际上是双重的:

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

6 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:9)

'django.contrib.sites',

进入您的INSTALLED_APPS和以下

$ ./manage.py syncdb

可能就够了。

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

答案 2 :(得分:2)

正如其他人所传达的,除了启用view_on_site之外,还需要一些额外的步骤。您必须在模型中实现get_absolute_url(),并在项目设置中启用Sites。

设置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()中生成路径的更复杂方法。

答案 3 :(得分:0)

如果您在settings.py中编辑了SITE_ID或者想要管理员的网站实例,请不要忘记重新启动您的网络服务器以使更改生效。

答案 4 :(得分:0)

在我看来,仅当get_absolute_url恢复到Django视图时,网站功能视图才起作用。如果您尝试创建一个链接,该链接似乎无法正常工作,该链接会重定向到Django无法控制的页面(即使该页面由apache本身从同一域提供)。

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

{% 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类中,否则两个按钮都会出现。

答案 5 :(得分:0)

根据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