我一直在使用Django应用程序一段时间,而Django管理界面效果很好,除了“网站上的视图”链接不起作用。每当我尝试使用它时,我都会收到OperationalError
消息:no such table: django_site
。我已经对这个问题进行了一些研究,似乎我必须设置Django sites framework才能使这个链接起作用,但我确定如何做到这一点。文档讨论了数据库表等,但它没有说明如何实际设置站点。所以我的问题实际上是双重的:
./manage.py syncdb
会自动“检测”我想要设置表格吗?settings.py
SITE_ID = 2 if DEBUG else 1
添加一些内容,或者manage.py
只是检测到我在调试网站上工作而不对网站框架做任何事情?答案 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设置添加到管理员表单:
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
查看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