web-dev-qa-db-fra.com

nom du champ du modèle dans les modèles

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 }}
24
Delremm

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.

50
pankaj28843

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 %}
5
misssprite

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 

1