2017-08-27 1 views
0

Im newbie utiliser python et django, j'ai un problème dans le site d'administration django.Comment fournir des liens vers toutes les données de plusieurs à plusieurs relations sur la table de site d'administration

Mon plan consiste à donner une URL différente à toutes les données existantes de plusieurs à plusieurs relations qui apparaissent sur la table du site d'administration. Lorsque les données de clic siswa mènent à la page d'édition.

# 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

Comme l'image ci-dessus, j'ai réussi à afficher les données, mais confus ajouter son url. Donc, je suis très reconnaissant pour vous qui peut fournir la meilleure solution.

Répondre

1

Docs Django avez-vous couvert sur la façon dont vous pouvez reverse admin urls.

De plus, nous aurons besoin de la méthode très pratique 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' 

Si vous utilisez Python 3.6 puis utilisez les chaînes de f (!):

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'