จะสร้าง get_admin_url / get app_label และชื่อคลาสได้อย่างไร

ฉันมีเมธอดโมเดล _get_admin_url และต้องการสร้าง URL แบบไดนามิก

class Person(models.Model):
    ...

    def _get_admin_url(self):
        "Returns the admin url."
        # return '/admin/some_app/person/%d' %self.id
        return '/admin/%s/%s/%d/' %(..., ..., d)

    admin_url = property(_get_admin_url)

ฉันจะรับค่า app_label และชื่อคลาสได้อย่างไร หรือมีวิธีที่ดีกว่า?


person allcaps    schedule 01.10.2013    source แหล่งที่มา


คำตอบ (2)


คุณสามารถใช้Reversing admin URLs คุณลักษณะ

from django.core import urlresolvers
c = Choice.objects.get(...)
change_url = urlresolvers.reverse('admin:polls_choice_change', args=(c.id,))

หากคุณต้องการอ้างอิงหน้า change_list คุณจะต้องทำเช่นนั้น

urlresolvers.reverse('admin:%s_%s_changelist' % (app_label, model_name))
person karthikr    schedule 01.10.2013
comment
ขอบคุณสำหรับคำตอบ. แต่ฉันยังต้องฮาร์ดโค้ด 'โพล' และ 'ตัวเลือก' ใช่ไหม หรือฉันขาดอะไรบางอย่างไป? - person allcaps; 01.10.2013
comment
ใช่ คุณจะต้องระบุชื่อแอปและชื่อรุ่น - person karthikr; 01.10.2013
comment
ฉันพบวิธีตั้งชื่อแอปและชื่อรุ่นแล้ว ขอขอบคุณอีกครั้งที่ชี้ให้ฉันดูการย้อนกลับ URL ของผู้ดูแลระบบ - person allcaps; 03.10.2013

นอกจากนี้ยังสามารถตั้งค่า app_name และ model_name ด้วย ContentType โปรดดู: https://stackoverflow.com/a/11395481/991572

ดังนั้นฉันจึงทำสิ่งนี้ใน webapp/models.py:

from django.contrib.contenttypes.models import ContentType
from django.core import urlresolvers

class Base(models.Model):
    title = models.CharField(max_length=100)

    def _get_admin_url(self):
        "Returns the admin change view url."
        content_type = ContentType.objects.get_for_model(self.__class__)
        view_name = "admin:%s_%s_change" % (content_type.app_label, content_type.model)
        url = urlresolvers.reverse(view_name, args=(self.id,)) 
        return url

    admin_url = property(_get_admin_url)            

class Book(Base):
    something = models.CharField(max_length=100)

ลงทะเบียนฐานและจองไปยังไซต์ผู้ดูแลระบบ สร้างรายการบางส่วนและในเชลล์:

In [1]: from webapp.models import *

In [2]: Base.objects.get(pk=1).admin_url
Out[2]: '/admin/webapp/base/1/'

In [3]: Book.objects.get(pk=2).admin_url
Out[3]: '/admin/webapp/book/2/'
person allcaps    schedule 02.10.2013