I have a django model:
class Book(models.Model):
[..]
and I want to have the model name as string: 'Book'. When I try to get it this way:
Book.__class__.__name__
it ret开发者_Go百科urns 'ModelBase'.
Any idea?
Try Book.__name__
.
Django models are derived from the ModelBase
, which is the Metaclass for all models.
As suggested by the answer above, you can use str(Book._meta)
.
This question is quite old, but I found the following helpful (tested on Django 1.11, but might work on older...), as you may also have the same model name from multiple apps.
Assuming Book is in my_app
:
print(Book._meta.object_name)
# Book
print(Book._meta.model_name)
# book
print(Book._meta.app_label)
# my_app
Instead of doing Book.__class__.__name__
on class itself, if you do it over a book object, then book_object.__class__.__name__
will give you 'Book' (i.e the name of the model)
I got class name by using,
str(Book._meta)
Book.__class__.__name__ -> this will give you the ModelBase
class Book(models.Model):
[..]
def class_name(self):
return self.__class__.__name__
With this way, whenever you called book.class_name()
in python code (also in the template {{book.class_name}}
) it will return class name which is 'Book'.
You could also retrieve the model name from the model's Meta class. This works on the model class itself as well as any instance of it:
# Model definition
class Book(models.Model):
# fields...
class Meta:
verbose_name = 'book'
verbose_name_plural = 'books'
# Get some model
book = Book.objects.first()
# Get the model name
book._meta.verbose_name
Setting verbose_name
and verbose_name_plural
is optional. Django will infer these values from the name of the model class (you may have noticed the use of those values in the admin site).
https://docs.djangoproject.com/en/3.0/ref/models/options/#verbose-name
精彩评论