Django model conditional default value based on other field
There is two tables Company
and Template_message
each company can have desired template messages for each message
messages have 3 types ( invitation,rejection,Job_offer)
now i want to set a default text for each template_message which the company can change it later on
but i dont know how to set the default value for each template message , based on their type
the model i designed is bellow :
class TemplateMessage(models.Model):
TEMPLATE_TYPE_CHOICES = (
('1', 'invitation'),
('2', 'Rejecting'),
('3', 'Job_offer_acceptance'),
)
type = models.CharField(max_length=4, choices=TEMPLATE_TYPE_CHOICES, default='1')
def subject_initials(type):
match type:
case 1:
return "[jobName] skills test invitation from [companyName]"
case 2:
return "Thank you from [companyName]"
case 3:
return "Job offer letter from [companyName]"
subject = models.CharField(max_length=256, default=subject_initials(type))
company = models.ForeignKey('Company', on_delete=models.CASCADE)
class Meta:
unique_together = ("company", "type")
def __str__(self):
return self.type
but it does not not work and when i go to admin panel the subject text is not set to any default value
you should override ModelAdmin.get_changeform_initial_data
method for your ModelAdmin
.
class MyModelAdmin(ModelAdmin):
... # any staff before
def get_changeform_initial_data(self, request):
initial_data = super().get_changeform_initial_data(request)
initial_data['subject'] = subject_initials(get_type_from(request))
return initial_data
... # any staff after
Other possibility_ override ModelAdmin.changeform
, to add in request.GET['subject'] = your_initial_subject.
class MyModelAdmin(ModelAdmin):
... # any staff before
def changeform_view(self, request, *args, **kwargs):
request.GET._mutable = True
request.GET['subject'] = your_initial_subject
return super().changeform_view(request, *args, **kwargs)
... # any staff after
But changing the request.GET/POST internal is a bad paractice.