How can I get the Django admin's “View on site” link to work?

穿精又带淫゛_ 提交于 2019-12-03 02:28:46

Putting

'django.contrib.sites',

into your INSTALLED_APPS and a following

$ ./manage.py syncdb

may suffice.

When installed, edit the Site instance (e.g. through /admin interface) to reflect your local hostname (e.g. localhost:8000).

Arthur Debert

Define a get_absolute_url on your model. The admin uses that method to figure out how to construct the objects url. See the docs.

As communicated by others, this requires a couple extra steps in addition to enabling view_on_site. You have to implement get_absolute_url() in your model, and enable Sites in your project settings.

Set the view_on_site setting

Add view_on_site setting to admin form:

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

Implement get_absolute_url()

Add get_absolute_url() to your model. In models.py:

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

Enable Sites

Add Sites in yourapp/settings.py:

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

Then update the database:

$ python manage.py migrate

Done!

Check out reverse() for a more sophisticated way to generate the path in get_absolute_url().

When you have edited either SITE_ID in settings.py or a Site instance thought the admin, don't forget to restart your web server for the change to take effect.

It seems to me that the view on site functionality works only if get_absolute_url refares to a Django view. It does not seem to work if you are trying to create a link, which redirects to a page out of Django's control (even if it is served from the same domain by apache itself).

In this case, it is easy to create the button manually by overriding admin tempale as follows:

{% 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 %}

Also, add view_on_site = False to your ModelAdmin class, otherwise both of the buttons will appear.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!