我是新手使用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'
如上图所示,我设法显示数据,但很难添加其网址。所以我非常感谢能够提供最佳解决方案的人。
答案 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'