Django:如何将URL请求路由到django.contrib.admin函数

时间:2018-07-29 18:03:46

标签: django django-admin

我希望Django返回与/myapp/add相同的对/admin/myapp/mymodel/add的请求响应。

myproject/myapp/models.py定义模型,并且myapp/admin.pydjango.contrib.admin注册。

myproject/myapp/models.py

from django.db import models

class MyModel(models.Model):
  ...

myproject/myapp/admin.py

from django.contrib import admin
from .models import MyModel

admin.site.register(MyModel)

我对如何将请求路由到项目django.contrib.admin中的urlpatterns感到困惑:

myproject/myproject/urls.py

urlpatterns = [
  url(r'^$', views.home_page, name='home'),
  url(r'^admin/', admin.site.urls),
  url(r'^myapp/add', ??????), 
]

打印resolve('/admin/myapp/mymodel/add/')的退货,这似乎是答案的一部分:

ResolverMatch(func=django.contrib.admin.options.add_view, args=(), kwargs={}, url_name=myapp_mymodel_add, app_names=['admin'], namespaces=['admin'])

1 个答案:

答案 0 :(得分:0)

好让我说这似乎很奇怪,但是无论如何:

在文件django.contrib.admin.options.py中,我们看到:

class ModelAdmin(BaseModelAdmin):

我们看到add视图返回

_changeform_view()

使用模板

django/contrib/admin/templates/change_form.html

因此,您希望在视图中呈现该模板。

但它会丢失大量上下文项,

所以您基本上必须重新实现django.admin.options._changeform_view

,然后将模板django/contrib/admin/templates/change_form.html复制到应用程序的模板目录

def admin_add(request):
  # admin.changeform_view code here
  return render(request, "myapp/change_form.html", {context{)

ps。我假设管理站点视图假定该用户是“超级用户”,而不是普通用户,因此您也要考虑这一点。