Как получить атрибут из другой модели в шаблоне django
SO У меня есть две модели, одна - Members, другая - PaymentDetail. Мне нужны все члены из модели Member в моем шаблоне, которые я могу получить из Members.object.all(), но я также хочу, чтобы платежный_статус всех этих членов был в моем шаблоне рядом с ними. Я не знаю, как это сделать, так как payment_status отсутствует в модели Member.
class Members(models.Model ):
user = models.ForeignKey(Users,verbose_name='User Id', on_delete=models.CASCADE)
com = models.ForeignKey(Committees, on_delete=models.CASCADE,verbose_name='Committee Name')
mem_status = models.CharField( max_length=20,choices=MEMBER_STATUS, verbose_name='Member Status')
mem_note = models.TextField(null=True, blank=True)
class PaymentDetails(models.Model):
mem = models.ForeignKey(Members,on_delete=models.CASCADE, related_name="payment_details",verbose_name='Memeber Phone no')
com = models.ForeignKey(Committees, on_delete=models.CASCADE,verbose_name='Committee Name')
payment_month = models.DateField(default=datetime.now())
payment_amount_debit = models.IntegerField(null=True,blank=True)
payment_amount_credit = models.IntegerField(null=True,blank=True)
payment_status = models.CharField(max_length=16, choices=PAYMENT_DETAILS_CHOICES, default="1")
payment_proof = models.ImageField(upload_to='images/')
payment_note = models.TextField(null=True,blank=True)
Я много искал и нашел, что есть что-то, называемое related name и setname, но я вроде как новичок, поэтому я не получаю желаемых результатов, используя их тоже.
Просто используйте payment_details
для каждого экземпляра Members
следующим образом:
members = Members.object.all()
for member in members:
print(f"Member {member.id} has payment status of " +
f"{member.payment_details.payment_status}")
member.payment_details
дает вам экземпляр PaymentDetail
, а member.payment_details.payment_status
является payment_status
полем PaymentDetail
экземпляра
Кстати, лучше использовать сингулярную форму в именах моделей.
Вы можете получить доступ к объекту платежных реквизитов через связанное имя. Я вижу, что вы определили payment_details
, поэтому в HTML шаблоне вы можете получить доступ к нему следующим образом:
member.payment_details.all()
Могут возникнуть проблемы с производительностью, поскольку payment_details.all()
будет выполняться запрос к базе данных. Вы можете избежать этого, используя prefetch_related('payment_details') в представлении django. Пример:
Member.objects.prefetch_related('payment_details')