Soru Django - Model örneğinden yönetici URL'si nasıl alınır?


Her şeyden önce, sorumu okuduğunuz için teşekkür ederim.

Yeni bir model örneği kaydedildiğinde kullanıcıya e-posta göndermeye çalışıyorum ve e-postanın bu model örneğinin yönetici sayfasına bir bağlantı eklemesini istiyorum. Doğru URL'yi almanın bir yolu var mı? Django'nun bu bilgiyi bir yerde saklaması gerektiğini düşünüyorum.


24
2018-05-02 19:21


Menşei




Cevaplar:


Bu Django pasajı yapmak gerekir:

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,))

self ana model sınıfına atıfta bulunur, örn. self.id nesnenin örneğini ifade eder id. Bunu bir property modele yapışarak @property yöntem imzasının üstüne dekoratör.


27
2018-05-02 19:26



Bu cevaplar işe yaramıyor. Ben sadece geri döndüm "/ admin / tracker / order / 2 /". Ana bilgisayar adını nasıl alabilirim? - Greg
@Greg Tabi ki, get_admin_url() Yukarıdaki size hostname sonra gider kısmı alır. Django'yu kullan Siteler Geçerli sitenin ana bilgisayar adını uygun şekilde almak için çerçeve. Daha sonra sonucuna önek get_admin_url(). - Joseph Victor Zammit
1.8 de iyi çalışıyor - GergelyPolonkai


@JosvicZammit'i koparmaya çalışmak değil ama ContentType Burada yanlış bir yaklaşımdır. Sadece boş bir DB sorgusu. İstenen bilgileri _meta özellik:

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,))

36
2018-05-02 20:13



Yorumlarda etkili bir şekilde kod örnekleri yapabiliyor olsaydım olurdu. Bu mutlak bir karışıklık olurdu. Josvic'in cevabını aldığını ve bunun için kredi aldığını, bu yüzden bir suç olmadığını, ama gerçekte bir yıl sonra niçin dikkat etmen gerektiğini bilmiyorum. - Chris Pratt


Bu, Josvic Zammit'in snippet'i ile aynı sonucu verir, ancak veritabanına vurmaz:

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,))

8
2017-10-04 07:14



attr değiştirmek module_name tarafından model_name (module_name undefined) - ppython
Django 1.8, bir modelin meta nesnesindeki 'model_adı' özniteliğini 'model_adı' olarak yeniden adlandırdı. Kod snippet'i güncellendi ... teşekkürler! - Mario Orlandi


Sadece python 3'ün hazır olduğu bu tek astarı kullanın:

from django.core.urlresolvers import reverse

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

Bu konuda daha fazla django yönetici sitesi doc, yönetici URL'lerini tersine çevirme.


4
2017-11-16 03:15



Olmalı self._meta.model_name ziyade self._meta.module_name. - nedned
Teşekkürler @nedned, sabitleme - radtek
Sadece mümkün olduğu için: reverse('admin:{m.app_label}_{m.model_name}_change'.format(m=self._meta), args=[self.pk]) - batisteo


Yani, Chris, Josvic ve Josh'un cevaplarını birleştirerek, modelinize ekleyebileceğiniz bir kopyala-yapıştır yöntemi (Django 1.8.3'te test edilmiştir).

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,))

2
2017-07-30 22:03