یه مدل داریم تو جنگو که پروفایل شرکت های مختلف توی اون ذخیره میشه:
1 2 3 4 5 6 7 8 |
class Company(models.Model, Template): name = models.CharField(max_length=80, unique=True) name_fixed = models.CharField(max_length=80, null=True) name_fa = models.CharField(max_length=80) homepage = models.URLField(max_length=200, null=True) tel = models.CharField(max_length=80, null=True) color_code = ColorField(max_length=7, default="#1EABFF") active = models.BooleanField(default=True) |
لازم شد که لوگو شرکت هم اضافه بشه اما از اونجایی که این مدل جاهای مختلف استفاده شده بود و توی فرمها و view های مختلف ازش استفاده شده اگه یه فیلد برای لوگو بهش اضافه کنیم قطعا باید خیلی از جاهای کد هم تغییر بدیم و احتمالا باگ هایی تولید بشن و از اونجایی که این سیستم براش تست نوشته نشده ممکن اطفاقات بدی بیوفته.
بنابراین رفتم دنبال اینکه چطور میشه بدون تغییر این مدل لوگو رو اضافه کنم. حداقل طوری که اگر جایی از این مدل داره استفاده میشه دیگه فیلدهاش عوض نشه. راه های مختلفی وجود داره ولی بهترینش بنظرم اینه که یه مدل جدید برای لوگو بسازیم و ارتباط OneToOne بینشون برقرار کنیم.
1 2 3 |
class CompanyLogo(models.Model): company = models.OneToOneField(Company, on_delete=models.CASCADE, related_name='logo') logo = models.ImageField(upload_to="company_images/", blank=True, null=True) |
و اینطوری ازش استفاده کنم
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
def vendor_detail(request, vendor_id): company = Company.objects.get(pk=vendor_id) company_logo = CompanyLogo.objects.filter(company=company).first() context = { 'company': company, 'company_logo': company_logo, } {% if company_logo %} <img src="{{ company_logo.logo.url }}" alt="{{ company.name }} Logo" width="150" height="100"> |