Suggère que j'ai un modèle:
from Django.db import models
class Test(models.Model):
name=models.CharField(max_length=255, verbose_name=u'custom name')
Comment puis-je obtenir le nom détaillé de mon modèle dans les modèles? Évident {{ test_instance.name.verbose_name }}
ne fonctionne pas.
J'apprécierais beaucoup la solution, tout comme lorsque l'on utilisait des formulaires, dans un modèle sur le terrain, on pouvait utiliser un attribut label
{{ form_field.label }}
Vous pouvez utiliser le code python suivant pour cela
Test._meta.get_field("name").verbose_name.title()
Si vous souhaitez utiliser ceci dans un modèle, il est préférable d’enregistrer une balise de modèle pour cela. Créez un dossier templatetags
dans votre application contenant deux fichiers (__init__.py
et verbose_names.py
). Mettez le code suivant dans verbose_names.py
:
from Django import template
register = template.Library()
@register.simple_tag
def get_verbose_field_name(instance, field_name):
"""
Returns verbose_name for a field.
"""
return instance._meta.get_field(field_name).verbose_name.title()
Maintenant, vous pouvez utiliser cette balise de modèle dans votre modèle après avoir chargé la bibliothèque de la manière suivante:
{% load verbose_names %}
{% get_verbose_field_name test_instance "name" %}
Vous pouvez lire à propos de Custom template tags
dans la documentation officielle de Django.
la méthode de psjinx est géniale!
Et peut-être aimerez-vous cela si vous voulez générer une liste de champs.
L'ajout d'un itérable à la classe Test facilite la liste du nom et de la valeur détaillés des champs.
Modèle
class Test(models.Model):
...
def __iter__(self):
for field in self._meta.fields:
yield (field.verbose_name, field.value_to_string(self))
Modèle
{% for field, val in test_instance %}
<div>
<label>{{ field }}:</label>
<p>{{ val }}</p>
</div>
{% endfor %}
sur la base de cette réponse https://stackoverflow.com/a/14498938 .in Django Model i ajouté
class Meta:
app_name = 'myapp'
dans listview j'ai
from Django.core import serializers
context['data'] = serializers.serialize( "python", self.get_queryset() )
à l'intérieur de mylist.html j'ai
{% for field, value in data.0.fields.items %}
<th style="text-align:center;">{% get_verbose_field_name data.0.model field %}</th>
{% endfor %}
dans le filtre:
from Django import template
register = template.Library()
from .models import Mymodel
@register.simple_tag
def get_verbose_field_name(instance, field_name):
"""
Returns verbose_name for a field.
"""
myinstance = eval(instance.split('.')[1].title())
return myinstance._meta.get_field(field_name).verbose_name.title()
instance dans le filtre ci-dessus pour l'exemple spécifique est myapp.mymodel i instance d'invalidité dans l'objet de modèle et le champ de retour i nom prolixe
ça marche dans Django 1.9