如何在管理站点表上提供从多对多关系中的每个数据的链接

时间:2017-08-27 00:32:36

标签: python django django-admin

我是新手使用python和django,我在django管理站点有问题。

我的计划是为管理网站表格中显示的多对多关系中的任何现有数据提供不同的网址。点击数据时,siswa将进入编辑页面。

# model.py
class WaliSiswa(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, null=True, blank=True)
    title = models.CharField(max_length=11, choices=TITLE)
    nama_lengkap = models.CharField(max_length=125)
    jenis_kelamin = models.CharField(max_length=1, choices=GENDER_CHOICES)
    relations = models.CharField(max_length=50, choices=RELATIONS)
    tempat_lahir = models.CharField(max_length=255)
    tanggal_lahir = models.DateField()
    alamat_ktp = models.CharField(max_length=500)
    alamat_tinggal_saat_ini = models.CharField(max_length=500)
    profesi = models.CharField(max_length=225)
    nomer_telepon = models.CharField(max_length=25)
    nomer_seluler = models.CharField(max_length=25)
    email = models.CharField(max_length=125)
    siswa = models.ManyToManyField(Siswa)

# admin.py
class WaliSiswaAdmin(admin.ModelAdmin):
    list_display = ('getTitleNamaLengkap', 'relations', 'getSiswa', )

    def getSiswa(self, obj):
        return ', '.join([d.nama_lengkap for d in obj.siswa.all()])
    getSiswa.short_description = 'Siswa'

enter image description here

如上图所示,我设法显示数据,但很难添加其网址。所以我非常感谢能够提供最佳解决方案的人。

1 个答案:

答案 0 :(得分:1)

Django docs向您介绍了如何reverse admin urls

另外,我们需要非常方便的format_html_join方法。

# admin.py

from django.core.urlresolvers import reverse  # django 1.9-
from django.urls import reverse  # django 1.10+
from django.utils.html import format_html_join

class WaliSiswaAdmin(admin.ModelAdmin):
    list_display = ('getTitleNamaLengkap', 'relations', 'getSiswa', )

    def getSiswa(self, obj):
        # Signature: format_html_join(sep, format_string, args_generator)
        return format_html_join(
               ', ', 
               '<a href="{}">{}</a>', 
               [(reverse('admin:<your_app_name>_siswa_change', args=(d.id,)), d.nama_lengkap) for d in obj.siswa.all()]
        )
    getSiswa.short_description = 'Siswa'

如果您使用的是Python 3.6,请使用f-strings(!):

from django.core.urlresolvers import reverse  # django 1.9-
from django.urls import reverse  # django 1.10+
from django.utils.html import mark_safe

class WaliSiswaAdmin(admin.ModelAdmin):
    list_display = ('getTitleNamaLengkap', 'relations', 'getSiswa', )

    def getSiswa(self, obj):
        return mark_safe(
            ', '.join([f'<a href="{reverse("admin:<your_app_name>_siswa_change", args=(d.id,))}">{d.nama_lengkap}</a>' for d in obj.siswa.all()])
        )
    getSiswa.short_description = 'Siswa'