возможно ли добавить поле возраста, которое автоматически заполняется во время выполнения на основе другого поля даты рождения в интерфейсе администратора django, я добавил скриншот, пытаясь объяснить, что я имею в виду
мои модели.py
class FamilyMember(models.Model):
transaction = models.ForeignKey(Transaction, on_delete=models.CASCADE)
family_group = models.ForeignKey(FamilyGroup,
on_delete=models.CASCADE,
null=True,
blank=True)
name = models.CharField(max_length=100, null=True, blank=True)
date_of_birth = models.DateField(null=True, blank=True)
relationship = models.ForeignKey(Relationship, on_delete=models.PROTECT)
dependant_child_age_range = models.ForeignKey(DependantChildAgeRange,
null=True,
blank=True,
on_delete=models.PROTECT)
care_percentage = models.PositiveSmallIntegerField(
null=True, blank=True, validators=[
MaxValueValidator(100),
])
income = models.DecimalField(max_digits=6,
decimal_places=2,
null=True,
blank=True)
rent_percentage = models.PositiveSmallIntegerField(
null=True, blank=True, validators=[
MaxValueValidator(100),
])
admin.py
class FamilyMemberInline(admin.TabularInline):
def formfield_for_foreignkey(self, db_field, request, **kwargs):
action = request.META['PATH_INFO'].strip('/').split('/')[-1]
if action == 'change':
transaction_id = request.META['PATH_INFO'].strip('/').split('/')[-2]
if db_field.name == "family_group":
kwargs["queryset"] = FamilyGroup.objects.filter(transaction=transaction_id)
return super(FamilyMemberInline, self).formfield_for_foreignkey(db_field, request, **kwargs)
model = FamilyMember
extra = 0
def sufficient_info_provided (self, obj):
return obj.sufficient_information_provided
sufficient_info_provided.boolean = True
readonly_fields = ['sufficient_info_provided',]
Переопределите встроенный метод get_queryset , чтобы аннотировать набор запросов с вычислением. Аннотация добавит атрибут age
к каждому объекту в наборе запросов.
Затем, как вы можете видеть в документации ModelAdmin.list_display, вы можете включить строку, представляющую ModelAdmin
метод, который принимает один аргумент — экземпляр модели. Inline работает так же, но вы должны включить метод в ModelAdmin.readonly_fields
.
Собираем все вместе:
class FamilyMemberInline(admin.TabularInline):
...
fields = (..., 'get_age')
readonly_fields = ('get_age',)
def get_queryset(self, request):
return (
super().get_queryset(request)
.annotate(age=...)
)
def get_age(self, instance):
return instance.age
@ha-neul он будет обновляться только после сохранения экземпляра.
мы не можем обновить этот возраст перед сохранением процесса? это вообще возможно на странице администратора?
@AbdullaOsama потребуется собственный javascript
@bdoubleu я немного запутался def get_queryset(self, request): return ( super().get_queryset(request) .annotate(age=...), что я должен заменить в age= ?
Взгляните на TruncYear
Это не оп. Просто любопытно: поле возраста будет обновляться во время «введите дату рождения» или после того, как вы сохраните экземпляр и откроете его снова? Спасибо!