2012-05-02 30 views
22

Trước hết, cảm ơn bạn đã đọc câu hỏi của tôi.Django - Cách nhận url quản trị từ ví dụ mẫu

Tôi đang cố gắng gửi email cho người dùng khi một phiên bản mẫu mới được lưu và tôi muốn email bao gồm liên kết tới trang quản trị cho phiên bản mẫu đó. Có cách nào để lấy URL chính xác không? Tôi hình Django phải có thông tin đó được lưu trữ ở đâu đó.

Trả lời

26

này Django snippet nên làm:

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

class MyModel(models.Model): 

    def get_admin_url(self): 
     content_type = ContentType.objects.get_for_model(self.__class__) 
     return urlresolvers.reverse("admin:%s_%s_change" % (content_type.app_label, content_type.model), args=(self.id,)) 

Các self đề cập đến mô hình lớp cha mẹ, ví dụ: self.id đề cập đến trường hợp của đối tượng id. Bạn cũng có thể thiết lập nó như là một property trên mô hình bằng cách gắn trang trí @property trên đầu trang của chữ ký phương thức.

+0

Các câu trả lời này dường như không hoạt động. Tôi chỉ lấy lại "/ admin/tracker/order/2 /". Làm thế nào để tôi nhận được tên máy chủ? – Greg

+0

@Greg Tất nhiên, 'get_admin_url()' ở trên cho bạn phần mà đi sau tên máy chủ. Sử dụng khung công tác Django [sites] (https://docs.djangoproject.com/en/dev/ref/contrib/sites/) để lấy tên máy chủ của trang hiện tại một cách thích hợp. Sau đó, tiền tố nó vào kết quả của 'get_admin_url()'. –

+1

Hoạt động tốt ở 1,8, quá – GergelyPolonkai

33

Không cố gắng tách @JosvicZammit, nhưng việc sử dụng ContentType là cách tiếp cận sai ở đây. Nó chỉ là một truy vấn DB lãng phí. Bạn có thể nhận được yêu cầu thông tin từ các thuộc tính _meta:

from django.core.urlresolvers import reverse 

info = (model_instance._meta.app_label, model_instance._meta.model_name) 
admin_url = reverse('admin:%s_%s_change' % info, args=(model_instance.pk,)) 
+5

Tôi sẽ có nếu bạn có thể thực hiện các mẫu mã một cách hiệu quả trong các nhận xét. Đây sẽ là một mớ hỗn độn tuyệt đối. Tôi lưu ý rằng Josvic đã có câu trả lời, và anh ta đã nhận được tín dụng cho nó, vì vậy, không có hành vi phạm tội, nhưng thực sự không chắc chắn lý do tại sao bạn nên quan tâm gần một năm sau khi thực tế. –

4

Chỉ cần sử dụng này một lót đó cũng là trăn 3 đã sẵn sàng:

from django.core.urlresolvers import reverse 

reverse('admin:{0}_{1}_change'.format(self._meta.app_label, self._meta.model_name), args=(self.pk,)) 

Thông tin thêm về này trong django site admin doc, reversing admin urls.

+0

Phải là 'self._meta.model_name' thay vì' self._meta.module_name'. – nedned

+0

Thanks @nedned, sửa chữa – radtek

+0

Chỉ vì có thể: 'đảo ngược ('quản trị: {m.app_label} _ {m.model_name} _change'.format (m = self._meta), args = [self.pk]) ' – batisteo

7

này cho kết quả tương tự như đoạn Josvic Zammit, nhưng không trúng cơ sở dữ liệu:

from django.core import urlresolvers 
from django.db import models 

class MyModel(models.Model): 

    def get_admin_url(self): 
     return urlresolvers.reverse("admin:%s_%s_change" % (self._meta.app_label, self._meta.model_name), args=(self.id,)) 
+0

thay đổi attr' module_name' bởi 'model_name' (' module_name' là không xác định) – ppython

+1

Django 1.8 đổi tên thuộc tính 'module_name' thành 'model_name' trong đối tượng meta của Mô hình. Đã cập nhật đoạn mã ... cảm ơn bạn! –

2

Vì vậy, kết hợp các câu trả lời bằng Chris, Josvic và Josh, đây là một phương pháp copy-paste bạn có thể thêm vào mô hình của bạn (thử nghiệm trên Django 1.8.3).

def get_admin_url(self): 
    """the url to the Django admin interface for the model instance""" 
    from django.core.urlresolvers import reverse 
    info = (self._meta.app_label, self._meta.model_name) 
    return reverse('admin:%s_%s_change' % info, args=(self.pk,)) 
Các vấn đề liên quan