0

I am displaying data in Django admin panel for many to many relationship tables. I got None instead of a list of names.

I am using:

  • Python: 3.6
  • Django: 2.2

List_display for ManytoMany fields in Admin panel

I had also already asked a related question on this topic. That being said I changed my model since then (I also got not answers).

models:

class Assessment(models.Model):
    name = models.CharField(max_length=255) 

class Participant(models.Model):
    user = models.OneToOneField(User,on_delete=models.CASCADE) 
    first_name = models.CharField(max_length=255,blank=True,null=True)

class Seminar(models.Model):
    topic = models.CharField(max_length=255)
        assessment = models.ManyToManyField(Assessment,blank=True)
        participant =       models.ManyToManyField(Participant,blank=True,through='SeminarParticipant',through_fields=('seminar','participant'))

class SeminarParticipant(models.Model): 
    seminar = models.ForeignKey(Seminar,blank=True,on_delete=models.CASCADE)
    participant = models.ForeignKey(Participant,blank=True,on_delete=models.CASCADE)
    request_time = models.PositiveIntegerField(default=0,validators=[MinValueValidator(0),])
    is_survey_completed = models.BooleanField(default=False)

admin:

@admin.register(Seminar)
class SeminarAdmin(admin.ModelAdmin):
    list_display = ('topic''assessment')  

    def assessment(self,obj):
        return "\n".join([item for item in obj.assessment.all()])

I was expecting name of assessment in list_display of seminar admin but got assessments.Assessment.None in list_display of admin panel.

Snapshot of output: snap shot of output

Thank you very much for your help

Nazim Kerimbekov
  • 4,712
  • 8
  • 34
  • 58

1 Answers1

0

assessment is the name of the field, which will be found before your method. Call the method something else and use that name in list_display.

class SeminarAdmin(admin.ModelAdmin):
    list_display = ('topic', 'assessment_list')  

    def assessment_list(self, obj):
        return "\n".join([item for item in obj.assessment.all()])

(Although note, assessment is an odd name for a field that contains many assessments; you should think about renaming the field itself.)

Daniel Roseman
  • 588,541
  • 66
  • 880
  • 895
  • actually item.name for item in obj.assessment.all() work for me. And thanks for the clarification towards naming things in django. Thanks alot! @Daniel Roseman –  Jul 18 '19 at 11:28