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