Я пытаюсь создать базовый шаблон для отображения значений полей выбранного экземпляра вместе с их именами. Думайте об этом как о стандартном выводе значений этого экземпляра в табличном формате с именем поля (особенно verbose_name, если оно указано в поле) в первом столбце и значением этого поля во втором столбце.
Например, допустим, у нас есть следующее определение модели:
class Client(Model):
name = CharField(max_length=150)
email = EmailField(max_length=100, verbose_name="E-mail")
Я хотел бы, чтобы это было выведено в шаблоне так (предположим, экземпляр с заданными значениями):
Field Name Field Value
---------- -----------
Name Wayne Koorts
E-mail waynes@email.com
То, чего я пытаюсь добиться, - это возможность передать экземпляр модели в шаблон и иметь возможность динамически перебирать его в шаблоне, что-то вроде этого:
<table>
{% for field in fields %}
<tr>
<td>{{ field.name }}</td>
<td>{{ field.value }}</td>
</tr>
{% endfor %}
</table>
Есть ли аккуратный «одобренный Джанго» способ сделать это? Кажется, это очень распространенная задача, и мне нужно будет делать ее часто для этого конкретного проекта.
источник
Вы можете использовать Джанго для Python сериализатор наборов запросов .
Просто поместите следующий код на ваш взгляд:
А потом в шаблоне:
Его большое преимущество заключается в том, что он обрабатывает поля отношений.
Для подмножества полей попробуйте:
источник
verbose_name
передавать поля?Наконец-то нашел хорошее решение для этого в списке рассылки dev :
В представлении добавить:
в шаблон добавьте:
источник
FooForm
естьModelForm
, не будет ли проще просто сделать:FooForm(instance=Foo.objects.get(pk=object_id)))
?В свете выпуска Django 1.8 (и формализации API Model _meta , я подумал, что обновлю это более поздним ответом.
Предполагая ту же модель:
Джанго <= 1,7
Django 1.8+ (формализованная модель _meta API)
В приведенном ниже примере мы будем использовать формализованный метод для извлечения всех экземпляров полей модели через
Client._meta.get_fields()
:На самом деле, мне было доведено до сведения, что вышесказанное немного за борт для того, что было необходимо (я согласен!). Простое лучше, чем сложное. Я оставляю выше для справки. Однако для отображения в шаблоне лучшим способом будет использование ModelForm и передача экземпляра. Вы можете выполнить итерацию по форме (эквивалент итерации по каждому из полей формы) и использовать атрибут label для получения verbose_name поля модели, а также использовать метод value для получения значения:
Теперь мы визуализируем поля в шаблоне:
источник
Вот еще один подход с использованием метода модели. Эта версия разрешает поля выбора / выбора, пропускает пустые поля и позволяет исключать определенные поля.
Тогда в вашем шаблоне:
источник
except User.DoesNotExist:
?_meta.get_fields()
пока не смогу проверить это.Хорошо, я знаю, что уже немного поздно, но, поскольку я наткнулся на это, прежде чем найти правильный ответ, может кто-то другой.
Из документации Django :
источник
ordering = ['-id']
вclass Meta:
вашем объектеmodels.py
. 2. затем используйтеBlog.objects.filter(name__startswith='Beatles').values()[0]
model
объект, вы снова попадете в базу данных, чтобы получить поля. Любой способ обойти это?Вы можете использовать
values()
метод aqueryset
, который возвращает словарь. Кроме того, этот метод принимает список полей для поднабора.values()
Метод не будет работать сget()
, так что вы должны использоватьfilter()
(обратитесь к API QuerySet ).В
view
...В
detail.html
...Для коллекции экземпляров, возвращаемых фильтром:
В detail.html ...
источник
table
, поэтому мне нужен каждыйkey
s вth
. Как мне это сделать без петель? Просто возьмите любой экземпляр объекта и выполните итерацию по нему дляkey
s? В настоящее время я отдельно схожуmodel_to_dict(Model())
заth
, но я думаю, что это ненужный экземпляр объекта.get_object
представление подробностей (искаженное из-за ограничения встроенного кода в комментариях, и не чувствую, что этого достаточно для его собственного ответа, учитывая, насколько насыщен этот поток):def get_object(self, **kwargs): obj = super().get_object(**kwargs) obj = obj.__class__.objects.filter(pk=obj.pk).values()[0] return obj
obj.get_absolute_url
в этот список, не дублируя строки?Я использовал https://stackoverflow.com/a/3431104/2022534, но заменил Django's model_to_dict () этим, чтобы иметь возможность обрабатывать ForeignKey:
Пожалуйста, обратите внимание, что я немного упростил это, удалив части оригинала, которые мне не нужны. Возможно, вы захотите вернуть их обратно.
источник
Вы можете иметь форму сделать работу за вас.
Тогда в шаблоне:
источник
DetailView
) хорошо работает для меня. Тем не менее, вы можете использоватьfield.label
вместоfield.name
.Там действительно должен быть встроенный способ сделать это. Я написал эту утилиту,
build_pretty_data_view
которая берет объект модели и экземпляр формы (форму, основанную на вашей модели) и возвращаетSortedDict
.Преимущества этого решения включают в себя:
SortedDict
.exclude()
список имен полей, чтобы исключить определенные поля.Meta: exclude()
, но вы все еще хотите вернуть значения, добавьте эти поля в необязательныйappend()
список.Чтобы использовать это решение, сначала добавьте этот файл / функцию куда-нибудь, а затем импортируйте его в свой
views.py
.utils.py
Так что теперь
views.py
вы можете сделать что-то вроде этогоТеперь в вашем
my-template.html
шаблоне вы можете перебирать данные так ...Удачи. Надеюсь, это поможет кому-то!
источник
Ниже мой, вдохновленный Шакером
get_all_fields
. Он получает диктат одного экземпляра модели, если встречается поле отношения, а затем рекурсивно присваивается значение поля дикту.Эта функция в основном используется для выгрузки экземпляра модели в данные json:
источник
Вместо того, чтобы редактировать каждую модель, я бы рекомендовал написать один тег шаблона, который будет возвращать все поля любой модели .
У каждого объекта есть список полей
._meta.fields
.У каждого объекта поля есть атрибут,
name
который будет возвращать свое имя, а методvalue_to_string()
, предоставленный вашей моделью,object
будет возвращать его значение.Остальное так же просто, как сказано в документации Django .
Вот мой пример, как этот тег шаблона может выглядеть:
источник
Да, это не красиво, вам придется сделать свою собственную обертку. Посмотрите на встроенном databrowse приложения, которое имеет все функции, необходимые на самом деле.
источник
Это может считаться хаком, но я сделал это перед использованием modelform_factory, чтобы превратить экземпляр модели в форму.
Класс Form содержит намного больше информации, которую очень легко перебирать, и он будет служить той же цели за счет немного больших накладных расходов. Если ваши размеры набора относительно малы, я думаю, что влияние на производительность будет незначительным.
Одно из преимуществ, кроме удобства, конечно, заключается в том, что вы можете легко превратить таблицу в редактируемую сетку данных на более позднем этапе.
источник
Я придумал следующий метод, который работает для меня, потому что в каждом случае с моделью будет связан ModelForm.
Вот выдержка из шаблона, который я использую для этого конкретного представления:
Хорошая особенность этого метода заключается в том, что я могу выбирать для каждого шаблона порядок, в котором я хотел бы отображать метки полей, используя кортеж, переданный в GetModelData, и указав имена полей. Это также позволяет мне исключить некоторые поля (например, внешний ключ пользователя), так как в окончательный словарь встроены только имена полей, переданные через кортеж.
Я не собираюсь принимать это как ответ, потому что я уверен, что кто-то может придумать что-то более «Джангоническое» :-)
Обновление: я выбрал это в качестве окончательного ответа, потому что это самый простой из тех, что дает то, что мне нужно. Спасибо всем, кто предоставил ответы.
источник
Django 1.7 решение для меня:
Там переменные точны для вопроса, но вы определенно должны быть в состоянии разобрать этот пример
Ключевым моментом здесь является использование
.__dict__
моделиviews.py :
шаблон :
в шаблоне я использовал фильтр для доступа к полю в dict
filters.py :
источник
Я использую это, https://github.com/miracle2k/django-tables .
источник
Этот подход показывает, как использовать класс, такой как ModelForm django, и тег шаблона, такой как {{form.as_table}}, но при этом вся таблица должна выглядеть как вывод данных, а не как форма.
Первым шагом было создание подкласса виджета TextInput в django:
Затем я создал подкласс ModelForm в django, чтобы поменять виджеты по умолчанию на версии только для чтения:
Это были единственные виджеты, которые мне были нужны. Но не должно быть сложно распространить эту идею на другие виджеты.
источник
Просто редактирование @wonder
Пусть Django обрабатывает все остальные поля, кроме связанных полей. Я чувствую что стабильнее
источник
Взгляните на приложение django-etc . У него есть
model_field_verbose_name
тег шаблона для получения подробного имени поля из шаблонов: http://django-etc.rtfd.org/en/latest/models.html#model-field-template-tagsисточник
Я только что проверил что-то вроде этого в оболочке и, похоже, выполняет свою работу:
Обратите внимание, что если вам нужно представление str () для сторонних объектов, вы должны определить его в методе str . Из этого у вас есть толкование значений для объекта. Затем вы можете сделать какой-то шаблон или еще что-нибудь.
источник
Джанго> = 2.0
Добавьте
get_fields()
к вашемуmodels.py
:Тогда назовите это как
object.get_fields
на вашемtemplate.html
:источник
источник