title: Django - change app name in admin
body: <p>I don't know how can I change name of my external app in my django admin panel. I can change verbose name of Constance app ('my constance settings'):</p>
  
  <pre><code>class ConstanceConfig(AppConfig):
      name = 'constance'
      verbose_name = 'My constance settings'
  </code></pre>
  
  <p>I don't have any idea how can I change "config" name. Any idea?
  <a href="https://i.stack.imgur.com/95Gwq.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/95Gwq.png" alt="enter image description here"></a></p>
  
  <p>My models.py:</p>
  
  <pre><code>from datetime import datetime
  from datetime import timedelta
  from urllib.parse import urlparse
  from django.db import models
  from django.urls import reverse
  from mainapp.widgets import MyTextField
  from django.template.defaultfilters import slugify
  from smart_selects.db_fields import ChainedForeignKey
  from django.db.models import Q
  from constance import config
  
  
  class Category(models.Model):
      category_name = models.CharField(max_length=30, unique=True,
                                   verbose_name='Nazwa kategorii')
      slug = models.SlugField()
      image = models.ImageField(upload_to='category_images',
                            verbose_name="Obrazek kategorii",
                            blank=True)
      category_description = models.TextField(default='Opis',
                                          verbose_name="Opis kategorii")
  
      class Meta:
          verbose_name_plural = " Kategorie"
  
      def save(self, *args, **kwargs):
          self.slug = slugify(self.category_name)
          super(Category, self).save(*args, **kwargs)
  
      def admin_image_thumb(self):
          '''
          Miniaturka obrazka kategorii dla panelu admina
          '''
          if self.image:
              return('&lt;img src="/media/%s" height="42" width="42" /&gt;') % 
  (self.image)
          else:
              return('&lt;img src="/media/category_images/default.ico" alt="" /&gt;')
  
      admin_image_thumb.short_description = 'Miniaturka'
      admin_image_thumb.allow_tags = True
  
      def image_thumb(self):
          '''
          Miniaturka obrazka kategorii
          '''
          if self.image:
              return('/media/%s') % (self.image)
          else:
              return('/media/category_images/default.ico')
  
      def get_active_sites(self):
          return Site.objects.filter(Q(category=self) | Q(category1=self), 
  is_active=True)
  
      image_thumb.short_description = 'Miniaturka'
      image_thumb.allow_tags = True
  
      def __str__(self):
          return self.category_name
  
  
  class SubCategory(models.Model):
      category = models.ForeignKey(
          'Category',
          related_name='subcategory',
          on_delete=models.CASCADE,
          blank=True,
          null=True,
          verbose_name='Kategoria nadrzędna'
      )
      name = models.CharField(max_length=30, verbose_name="Nazwa subkategorii")
      slug = models.SlugField()
  
      def save(self, *args, **kwargs):
          self.slug = slugify(self.name)
          super(SubCategory, self).save(*args, **kwargs)
  
      def get_active_sites(self):
          return Site.objects.filter(Q(subcategory=self) | Q(subcategory1=self), is_active=True)
  
      class Meta:
          verbose_name_plural = " Subkategorie"
  
      def __str__(self):
          return self.name
  
  
  def get_deadline():
      return datetime.today() + timedelta(days=20)
  
  
  class Site(models.Model):
      category = models.ForeignKey('Category')
      subcategory = ChainedForeignKey(
          'SubCategory',
           chained_field='category',
          chained_model_field='category',
          show_all=False,
          auto_choose=True,
          default=None)
      name = models.CharField(max_length=config.TITLE_LENGTH_MAX, 
  verbose_name="Tytuł")
      slug = models.SlugField()
      description = models.TextField(max_length=config.DESCRIPTION_LENGTH_MAX, 
  verbose_name="Opis")
      # importuje zmienione TextFields widgets.py
      keywords = MyTextField(max_length=config.KEYWORDS_LENGTH_MAX, 
  verbose_name="Słowa kluczowe")
      date = models.DateTimeField(default=datetime.now)
      date_end = models.DateTimeField(null=True, blank=True, default=None)
      url = models.URLField()
      is_active = models.BooleanField(default=False, verbose_name='Aktywna')
  
      flagged = models.TextField(max_length=400, verbose_name="Flagowanie", 
  null=True, blank=True, default='')
      flagged_true = models.BooleanField(default=False, verbose_name='Oflagowana')
  
      category1 = models.ForeignKey('Category', related_name='category', 
  blank=True, null=True, default=None)
      subcategory1 = ChainedForeignKey(
           'SubCategory',
          chained_field='category1',
          chained_model_field='category',
          related_name='subcategory',
          show_all=False,
          auto_choose=True, blank=True, null=True)
  
      group = models.ForeignKey('Group', default='Podstawowy',
                            help_text="&lt;div id='group'&gt;&lt;ul&gt;&lt;li&gt;Możesz dodać 
  wpis do 1 kategorii&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;")
  
      email = models.EmailField(help_text='Podaj adres email')
      user = models.CharField(max_length=100)
      kod = models.CharField(max_length=20)
  
      def save(self, *args, **kwargs):
           self.slug = slugify(self.name)
           # if len(self.flagged.splitlines() &gt; 3):
           #     self.flagged_true = True
          super(Site, self).save(*args, **kwargs)
  
      def get_absolute_url(self):
          return reverse('site', args=[str(self.category.slug),
                                   str(self.subcategory.slug), str(self.slug), 
  str(self.id)])
  
      def get_thumb(self):
          host = urlparse(self.url).hostname
          if host.startswith('www.'):
              host = host[4:]
          thumb = 'http://free.pagepeeker.com/thumbs.php?size=l&amp;url=http://' + host
          # thumb = 'https://api.thumbalizr.com/?url=http://' + host + '&amp;width=500'
          return thumb
  
      class Meta:
          verbose_name_plural = "Strony"
  
      def __str__(self):
          return self.name
  
  
  class Group(models.Model):
      group_name = models.CharField(max_length=30, verbose_name='Nazwa grupy', 
  unique=True)
      codes = models.TextField(null=True, blank=True)
      pay = models.CharField(
          max_length=10,
          choices=(('PAID', 'PŁATNY'), ('FREE', 'DARMOWY')),
          default='FREE',
          verbose_name="Czy płatny")
      time = models.CharField(
          max_length=3,
          choices=(('T', 'TAK'), ('N', 'NIE')),
          default='N',
          help_text='Czy wpis ma być wyłączony po jakimś czasie czy 
  bezterminowy')
      days = models.IntegerField(default=1)
      premium_box = models.CharField(
           max_length=3,
      choices=(('T', 'TAK'), ('N', 'NIE')),
      default='N',
      help_text='Czy wpis ma być wyświetlany w okienku reklamowym')
  category = models.CharField(
      max_length=2,
      choices=(('1', '1'), ('2', '2')),
  )
  
  is_active = models.BooleanField(default=True, verbose_name='Aktywna')
  
  class Meta:
      verbose_name_plural = "Grupy wpisów"
  
  def __str__(self):
      return self.group_name
  </code></pre>
  
  <p>And part of my admin.py:</p>
  
  <pre><code>from constance.admin import ConstanceAdmin, ConstanceForm, Config
  
  
  class CustomConfigForm(ConstanceForm):
      def __init__(self, *args, **kwargs):
          super(CustomConfigForm, self).__init__(*args, **kwargs)
  
  
  class ConfigAdmin(ConstanceAdmin):
      change_list_form = CustomConfigForm
      change_list_template = 'admin/config/change_list.html'
  
  
  admin.site.unregister([Config])
  admin.site.register([Config], ConfigAdmin)
  </code></pre>
  
  <p>In my venvs files I found admin.py (inside constance directory). There is:</p>
  
  <pre><code>class Config(object):
      class Meta(object):
          app_label = 'constance'
          object_name = 'Config'
          model_name = module_name = 'config'
          verbose_name_plural = _('config')
          abstract = False
          swapped = False
  
          def get_ordered_objects(self):
              return False
  
          def get_change_permission(self):
              return 'change_%s' % self.model_name
  
          @property
          def app_config(self):
              return apps.get_app_config(self.app_label)
  
     _meta = Meta()
  </code></pre>
  
  <p>I can change </p>
  
  <pre><code>verbose_name_plural = _('config')
  </code></pre>
  
  <p>to:</p>
  
  <pre><code>verbose_name_plural = _('My config label')
  </code></pre>
  
  <p>I still can't change this from my admin.py file...</p>