Модель форма: Создание форм из моделей — Документация Django 1.9
Создание форм из моделей — Документация Django 1.9
ModelForm
- class
ModelForm
При разработке приложения, использующего базу данных, чаще всего вы будете работать с формами, которые аналогичны моделям. Например, имея модель BlogComment
, вам может потребоваться создать форму, которая позволит людям отправлять комментарии. В этом случае явное определение полей формы будет дублировать код, так как все поля уже описаны в модели.
По этой причине Django предоставляет вспомогательный класс, который позволит вам создать класс Form
по имеющейся модели.
Например:
>>> from django.forms import ModelForm >>> from myapp.models import Article # Create the form class. >>> class ArticleForm(ModelForm): ... class Meta: ... model = Article ... fields = ['pub_date', 'headline', 'content', 'reporter'] # Creating a form to add an article.>>> form = ArticleForm() # Creating a form to change an existing article. >>> article = Article.objects.get(pk=1) >>> form = ArticleForm(instance=article)
Типы полей
Сгенерированный класс Form
будет содержать поле формы для каждого поля модели в порядке указанном в атрибуте fields
.
Каждому полю модели соответствует стандартное поле формы. Например, CharField
поле модели будет представлено на форме как CharField
, а ManyToManyField
поле модели будет представлено как MultipleChoiceField
. Ниже представлен полный список соответствия полей модели и формы:
Как вы могли ожидать, ForeignKey
ManyToManyField
поля модели являются особыми случаями:Поле
ForeignKey
модели представлено полем формыModelChoiceField
, которое является обычнымChoiceField
, но с вариантами значений, полученными изQuerySet
.Поле
ManyToManyField
модели представлено полем формыModelMultipleChoiceField
, которое является обычнымMultipleChoiceField`, но с вариантами значений, полученными из ``QuerySet
.
В дополнение, каждое поле созданной формы имеет следующие атрибуты:
Если у поля модели есть
blank=True
, тогда к полю формы будет добавленоrequired=False
, иначе –required=True
.Значением атрибута
label
поля будет значение поляverbose_name
модели, причём первый символ этого значения будет преобразован в верхний регистр.Значением атрибута
help_text
поля формы будет значение атрибутаhelp_text
поля модели.Если для поля модели установлен атрибут
choices
, тогда для поля формы будет использоваться виджетSelect
, который будет отображать содержимое этого атрибута.blank=False
и явное значениеdefault
(при этом, это значение будет выбрано по умолчанию).
В конце, следует отметить, что вы можете переопределить поле формы, используемое для определённого поля модели. Переопределение стандартных полей описано ниже.
Полный пример
Рассмотрим этот набор полей:
from django.db import models from django.forms import ModelForm TITLE_CHOICES = ( ('MR', 'Mr.'), ('MRS', 'Mrs.'), ('MS', 'Ms.'), ) class Author(models.Model): name = models.CharField(max_length=100) title = models.CharField(max_length=3, choices=TITLE_CHOICES) birth_date = models.DateField(blank=True, null=True) def __str__(self): # __unicode__ on Python 2 return self. name class Book(models.Model): name = models.CharField(max_length=100) authors = models.ManyToManyField(Author) class AuthorForm(ModelForm): class Meta: model = Author fields = ['name', 'title', 'birth_date'] class BookForm(ModelForm): class Meta: model = Book fields = ['name', 'authors']
Для этих моделей показанные выше классы ModelForm
будут аналогичны следующим формам (разница будет только в методе save()
, что мы вскоре рассмотрим.):
from django import forms class AuthorForm(forms.Form): name = forms.CharField(max_length=100) title = forms.CharField(max_length=3, widget=forms.Select(choices=TITLE_CHOICES)) birth_date = forms.DateField(required=False) class BookForm(forms.Form): name = forms.CharField(max_length=100) authors = forms.ModelMultipleChoiceField(queryset=Author.objects.all())
Валидация в
ModelForm
ModelForm
:Валидация форм
Валидация объекта модели
Как и валидация в обычной форме валидация в модельной форме выполняется при вызове is_valid()
или при обращении к атрибуту errors
, или при явном вызове full_clean()
, но на практике вы не будете использовать последний метод.
Валидация модели (Model.full_clean()
) выполняется после валидации формы, сразу после завершения метода clean()
.
Предупреждение
ModelForm
. Например, поля даты модели преобразуют значения в объект даты. Ошибка валидации может оставить объект в неопределенном состоянии и лучше не использовать его в последующем коде.Переопределение метода clean()
Вы можете переопределить метод clean()
модели для того, чтобы обеспечить дополнительную проверку. Всё это аналогично работе с обычной формой.
Экземпляр модельной формы, привязанный к объекту модели имеет атрибут instance
, через который методы модельной формы имеют доступ к соответствующему экземпляру модели.
Предупреждение
Метод ModelForm.clean()
unique
, unique_together
или unique_for_date|month|year
.Если вы хотите переопределить метод clean()
, вызовите метод clean()
родительского класса.
Взаимодействие с механизмами модели
В процессе проверки данных ModelForm
будет вызывать метод clean()
каждого поля вашей модели, соответствующего полю формы. Для полей модели, которые были исключены из формы, проверка данных производиться не будет. Обратитесь к документации по
Метод модели clean()
вызывается перед проверкой уникальности полей. Смотрите валидацию объектов модели, чтобы узнать как работает clean()
.
Определение
error_messages
Сообщения ошибки из form field
или form Meta имеют приоритет над сообщениями ошибок из model field
.
Error messages defined on model fields
are only used when the ValidationError
is raised during the model validation step and no corresponding error messages are defined at
the form level.
Вы можете переопределить сообщения об ошибке для
, который были вызваны при валидации модели, определив ключ NON_FIELD_ERRORS
в атрибут error_messages
класса ModelForm.Meta
:
from django.forms import ModelForm from django.core.exceptions import NON_FIELD_ERRORS class ArticleForm(ModelForm): class Meta: error_messages = { NON_FIELD_ERRORS: { 'unique_together': "%(model_name)s's %(field_labels)s are not unique.", } }
Метод
save()
Каждая форма, созданная с помощью ModelForm
, обладает методом save()
. Этот метод создаёт и сохраняет объект в базе данных, используя для этого данные, введённые в форму. Класс, унаследованный от
, может принимать существующий экземпляр модели через именованный аргумент instance
. Если такой аргумент указан, то save()
обновит переданную модель. В противном случае, save()
создаст новый экземпляр указанной модели:
>>> from myapp.models import Article >>> from myapp.forms import ArticleForm # Create a form instance from POST data. >>> f = ArticleForm(request.POST) # Save a new Article object from the form's data. >>> new_article = f.save() # Create a form to edit an existing Article, but use # POST data to populate the form. >>> a = Article.objects.get(pk=1) >>> f = ArticleForm(request.POST, instance=a) >>> f.save()
Обратите внимание, если форма не была проверена, вызов save()
выполнит ее, обратившись к form.errors
. Если данные не верны, будет вызвано исключение ValueError
– то есть, если form.errors
равно True
.
Метод save()
принимает необязательный именованный аргумент commit
, который может иметь значения True
или False
. При вызове save()
с commit=False
метод вернёт объект, который ещё не был сохранён в базе данных. В этом случае, вам самостоятельно придётся вызвать метод save()
у полученного объекта. Это бывает полезно, когда требуется выполнить дополнительные действия над объектом до его сохранения или если вам требуется воспользоваться одним из параметров сохранения модели. Атрибут commit
по умолчанию имеет значение True
.
Использование commit=False
также полезно в случае, когда ваша модель имеет связь “многие-ко-многим” с другой моделью. Для такой модели, если метод save()
вызван с аргументом commit=False
, то Django не может немедленно сохранить данные для такой связи, т.к. невозможно создать связи для объекта, который не сохранен в базе данных.
Чтобы решить эту задачу, каждый раз, когда вы сохраняете форму, указывая commit=False
, Django добавляет метод save_m2m()
к вашему классу ModelForm
. После того, как вы вручную сохранили экземпляр формы, вы можете вызвать метод save_m2m()
для сохранения данных, связанных через “многие-ко-многим”. Например:
# Create a form instance with POST data. >>> f = AuthorForm(request.POST) # Create, but don't save the new author instance. >>> new_author = f.save(commit=False) # Modify the author in some way. >>> new_author.some_field = 'some_value' # Save the new instance. >>> new_author.save() # Now, save the many-to-many data for the form. >>> f.save_m2m()
Вызов метода save_m2m()
требуется только в случае, если вы используете save(commit=False)
. Если вы просто используете save()
для формы, то все данные (включая связи “многие-ко-многим”), будут сохранены, не требуя для этого дополнительных действий. Например:
# Create a form instance with POST data. >>> a = Author() >>> f = AuthorForm(request.POST, instance=a) # Create and save the new author instance. There's no need to do anything else. >>> new_author = f.save()
Если не принимать во внимание методы save()
и save_m2m()
, то ModelForm
работает аналогично обычной Form
. Например, метод is_valid()
используется для проверки данных, метод is_multipart()
используется для определения загрузки файла (в этом случае request.FILES
должен быть передан форме) и так далее. Обратитесь к документу Привязка загруженных файлов к форме для получения подробностей.
Указываем какие поля использовать
Настоятельно рекомендуем явно указать все поля отображаемые в форме, используя параметр fields
. Иначе по ошибке, при добавлении нового поля в модель, можно позволить его редактировать пользователям и таким образом создать уязвимость. В зависимости от способа рендеринга формы, такая ошибка может быть не легко заметна на сайте.
Самый простой способ указать поля — автоматически добавить все или исключить определенные. Но такой способ не безопасен (например, случай на GitHub).
Но если вы уверены в том, что делаете, вот как использовать этот подход:
В параметре
fields
указать специальное значение'__all__'
, которое указывает использовать все поля модели. Например:from django.forms import ModelForm class AuthorForm(ModelForm): class Meta: model = Author fields = '__all__'
Используйте атрибут
exclude
внутреннего классаModelForm.Meta
. Этот атрибут, если он указан, должен содержать список имён полей, которые не должны отображаться на форме.Например:
class PartialAuthorForm(ModelForm): class Meta: model = Author exclude = ['title']
Так как модель
Author
содержит три поля: ‘name’, ‘title ‘ и ‘birth_date’, то форма будут отображать поляname
иbirth_date
.
При использовании одного из этих способов, порядок полей в форме будет аналогичен порядку полей в модели, ManyToManyField
поля будут в конце.
Если поле модели содержит editable=False
, каждая форма, созданная по модели с помощью ModelForm
, не будет включать в себя это поле.
В старых версиях, в форме будут представлены все поля модели, если не определить значения для fields
и exclude
. Сейчас такое поведение вызовет исключение ImproperlyConfigured
.
Примечание
Поля, которые не определены в форме, не будут учитываться при вызове метода save()
. Также, если вы вручную добавите в форму исключенные поля, то они не будут заполняться из экземпляра модели.
Django будет препятствовать всем попыткам сохранить неполную модель. Таким образом, если модель требует заполнения определённых полей и для них не предоставлено значение по умолчанию, то сохранить форму для такой модели не получится. Для решения этой проблемы вам потребуется создать экземпляр такой модели, передав ему начальные значения для обязательных, но незаполненных полей:
author = Author(title='Mr') form = PartialAuthorForm(request. POST, instance=author) form.save()
В качестве альтернативы, вы можете использовать save(commit=False)
и вручную определить все необходимые поля:
form = PartialAuthorForm(request.POST) author = form.save(commit=False) author.title = 'Mr' author.save()
Обратитесь к разделу section on saving forms для подробностей по использованию save(commit=False)
.
Переопределение стандартных типов полей или виджетов
Стандартные типы полей, описанные выше, имеют целесообразные настройки по умолчанию. Если ваша модель имеет поля типа DateField
, то скорее всего вы пожелаете, чтобы форма использовала поле DateField
для его отображения. Но класс ModelForm
представляет широкие возможности по управлению типами полей формы, а также виджетами для их представления.
Для того, чтобы указать собственный виджет для поля, следует использовать атрибут widgets
внутреннего класса Meta
. Его значением должен быть словарь, ключами которого являются имена полей, а значениями — классы или экземпляры виджетов.
Например, если необходимо использовать CharField
для того, чтобы поле name
модели Author
было представлено в виде <textarea>
вместо стандартного <input type="text">
, то вы можете переопределить виджет поля:
from django.forms import ModelForm, Textarea from myapp.models import Author class AuthorForm(ModelForm): class Meta: model = Author fields = ('name', 'title', 'birth_date') widgets = { 'name': Textarea(attrs={'cols': 80, 'rows': 20}), }
Ещё раз напомним, что аргумент widgets
принимает словарь с экземплярами (т.е., Textarea(...)
) или классами (т.е., Textarea
) виджетов.
Аналогично можно переопределить параметры labels
, help_texts
и error_messages
указав в Meta
.
Например, для переопределим параметры поля name
:
from django.utils.translation import ugettext_lazy as _ class AuthorForm(ModelForm): class Meta: model = Author fields = ('name', 'title', 'birth_date') labels = { 'name': _('Writer'), } help_texts = { 'name': _('Some useful help text.'), } error_messages = { 'name': { 'max_length': _("This writer's name is too long."), }, }
Вы также можете указать field_classes
, чтобы настроить типы полей, которые будут использовать формой.
Например, если вы хотите использовать MySlugFormField
для поля slug
, вы можете сделать следующее:
from django.forms import ModelForm from myapp.models import Article class ArticleForm(ModelForm): class Meta: model = Article fields = ['pub_date', 'headline', 'content', 'reporter', 'slug'] field_classes = { 'slug': MySlugFormField, }
Если вы желаете продолжить настойку поля, включая его тип, метку и так далее, то вы можете декларативно указать поля, как это делается при использовании Form
.
Чтобы переопределить валидаторы поля, укажите их в аргументе validators
:
from django.forms import ModelForm, CharField from myapp.models import Article class ArticleForm(ModelForm): slug = CharField(validators=[validate_slug]) class Meta: model = Article fields = ['pub_date', 'headline', 'content', 'reporter', 'slug']Добавлено в Django 1.9:
Был добавлен атрибут Meta.field_classes
.
Примечание
Когда вы явно создаете поле формы, необходимо знать как связанны ModelForm
и Form
.
ModelForm
это дочерний класс Form
, который может автоматически создавать поля формы. При создании полей учитываются параметры класса Meta
и явно определенные поля формы. ModelForm
автоматически создаст только те поля, которые отсутствуют в форме.
Явно определенные в классе поля создаются как есть, параметры Meta
, такие как widgets
, labels
, help_texts
или error_messages
, игнорируются, они учитываются только для создании дополнительных полей.
При явном создании поля, Django предполагает, что вы будете определять поведение формы в целом. Следовательно, стандартные атрибуты модели (такие как max_length
или required
) не передаются полям формы. Если вам потребуется обеспечить поведение, определённое в модели, вам потребуется явно установить соответствующие аргументы при определении поля формы.
Например, если модель Article
выглядит так:
class Article(models.Model): headline = models.CharField(max_length=200, null=True, blank=True, help_text="Use puns liberally") content = models.TextField()
и вы желаете выполнить свою проверку поля headline
, оставляя неизменными атрибуты blank
и help_text
, вы можете определить ArticleForm
следующим образом:
class ArticleForm(ModelForm): headline = MyFormField(max_length=200, required=False, help_text="Use puns liberally") class Meta: model = Article fields = ['headline', 'content']
Тип поля формы должен работать с типом значения соответствующего поля модели. Если они не соответствуют — вы получите ValueError
.
Обратитесь к документации на поля формы для получения дополнительной информации о полях и их аргументах.
Локализация в полях
По умолчанию поля в ModelForm
не локализируют свои данные. Для локализации полей можно использовать параметр localized_fields
класса Meta
.
>>> from django.forms import ModelForm >>> from myapp.models import Author >>> class AuthorForm(ModelForm): ... class Meta: ... model = Author ... localized_fields = ('birth_date',)
Если в localized_fields
указать '__all__'
, будут локализированы все поля.
Наследование форм
Аналогично обычным формам, вы можете наследоваться ModelForm
. Это удобно когда надо добавить дополнительные поля или методы к базовому классу и использовать результат для создания других модельных форм. Например, для класса ArticleForm
:
>>> class EnhancedArticleForm(ArticleForm): . .. def clean_pub_date(self): ... ...
Мы создали форму, аналогичную ArticleForm
, добавив дополнительную проверку и обработку для поля pub_date
.
Вы также можете наследовать внутренний класс Meta
, если требуется внести изменения в списки Meta.fields
или Meta.excludes
:
>>> class RestrictedArticleForm(EnhancedArticleForm): ... class Meta(ArticleForm.Meta): ... exclude = ('body',)
Здесь мы добавили метод из EnhancedArticleForm
и изменили оригинальный ArticleForm.Meta
, убрав одно поле.
Тем не менее, надо уточнить несколько моментов.
Применяются стандартные правила языка Python для разрешения имён. Если ваш класс унаследован от нескольких базовых классов, которые обладают внутренним классом
Meta
, и для него не определён собственныйMeta
класс, то этот класс будет унаследован из первого базового.Можно унаследоваться одновременно от
Form
иModelForm
, однако,ModelForm
должен быть первым в MRO. Т.к. эти классы используют разные мета-классы, а класс может использовать только один метакласс.Можно декларативно удалить
Field
родительского класса, указав в названииNone
в дочернем классе.Таким способом можно исключить только те поля, которые были декларативно описаны в родительском классе. Поле
ModelForm
будет в любом случае созданы мета-классом. Чтобы переопределить их, используйте метод описанный в Указываем какие поля использовать.
Передача начальных значений
Аналогично обычным формам, есть возможность указать начальные данные, передав параметр initial
при создании экземпляра формы. Предоставленные таким образом начальные данные переопределят начальные данные самих полей формы и значения из подключенного экземпляра модели. Например:
>>> article = Article.objects.get(pk=1) >>> article.headline 'My headline' >>> form = ArticleForm(initial={'headline': 'Initial headline'}, instance=article) >>> form['headline'].value() 'Initial headline'
Функция-фабрика модельных форм
Вы можете создать форму по модели используя функцию modelform_factory()
, вместо создания класса. В некоторых случаях это более удобный способ:
>>> from django.forms import modelform_factory >>> from myapp.models import Book >>> BookForm = modelform_factory(Book, fields=("author", "title"))
Можно указать определенные настройки для формы, например отображаемые поля:
>>> from django.forms import Textarea >>> Form = modelform_factory(Book, form=BookForm, ... widgets={"title": Textarea()})
Указать используемые поля можно с помощью аргументов fields
и exclude
. Смотрите описание ModelForm
Указываем какие поля использовать.
… или включить локализацию для полей:
>>> Form = modelform_factory(Author, form=AuthorForm, localized_fields=("birth_date",))
Наборы модельных форм
- class
models.
BaseModelFormSet
Аналогично наборам обычных форм, Django представляет ряд расширенных классов наборов форм, которые упрощают взаимодействие с моделями Django. Давайте воспользуемся моделью Author
:
>>> from django.forms import modelformset_factory >>> from myapp.models import Author >>> AuthorFormSet = modelformset_factory(Author, fields=('name', 'title'))
Использование аргумента«fields« ограничивает набор форм указанным списком полей. В качестве альтернативы можно определить список полей, которые не должны отображаться на формах. Сделать это можно с помощью аргумента exclude
:
>>> AuthorFormSet = modelformset_factory(Author, exclude=('birth_date',))Изменено в Django 1. 8:
В старых версиях, в наборе форм будут представлены все поля модели, если не определить значения для fields
и exclude
. Сейчас такое поведение вызовет исключение ImproperlyConfigured
.
Этот код создаст набор форм, которые будут работать с данными модели Author
. По функционалу набор модельных форм аналогичен набору обычных форм:
>>> formset = AuthorFormSet() >>> print(formset) <input type="hidden" name="form-TOTAL_FORMS" value="1" /><input type="hidden" name="form-INITIAL_FORMS" value="0" /><input type="hidden" name="form-MAX_NUM_FORMS" /> <tr><th><label for="id_form-0-name">Name:</label></th><td><input type="text" name="form-0-name" maxlength="100" /></td></tr> <tr><th><label for="id_form-0-title">Title:</label></th><td><select name="form-0-title"> <option value="" selected="selected">---------</option> <option value="MR">Mr. </option> <option value="MRS">Mrs.</option> <option value="MS">Ms.</option> </select><input type="hidden" name="form-0-id" /></td></tr>
Примечание
modelformset_factory()
использует фабрику обычных форм formset_factory()
для создания набора форм. Это означает, что функционал модельных форм является надстройкой над функционалом набора обычных форм.
Изменение выборки
По умолчанию, при создании набора модельных форм используется выборка, которая содержит все объекты модели (т.е., Author.objects.all()
). Такое поведение можно скорректировать, используя аргумент queryset
:
>>> formset = AuthorFormSet(queryset=Author.objects.filter(name__startswith='O'))
Также вы можете унаследоваться от класса набора модельных форм и определить self.queryset
в конструкторе, указав необходимые параметры выборки:
from django. forms import BaseModelFormSet from myapp.models import Author class BaseAuthorFormSet(BaseModelFormSet): def __init__(self, *args, **kwargs): super(BaseAuthorFormSet, self).__init__(*args, **kwargs) self.queryset = Author.objects.filter(name__startswith='O')
Теперь передадим ваш класс BaseAuthorFormSet
в функцию фабрики:
>>> AuthorFormSet = modelformset_factory( ... Author, fields=('name', 'title'), formset=BaseAuthorFormSet)
Если требуется создать пустой набор форм, т.е. который не включает ни одну существующую модель, то передайте в набор пустую выборку:
>>> AuthorFormSet(queryset=Author.objects.none())
Настройка
form
По умолчанию, когда вы используете modelformset_factory
, форма будет создана с помощью modelform_factory()
. Часто необходимо указать свою форму. Например, форму с собственной валидацией:
class AuthorForm(forms. ModelForm): class Meta: model = Author fields = ('name', 'title') def clean_name(self): # custom validation for the name field ...
Для этого передайте вашу форму в функцию фабрики:
AuthorFormSet = modelformset_factory(Author, form=AuthorForm)
Вам не обязательно создавать свою форму. Функция modelformset_factory
принимает различный аргументы, которые будут переданы в modelform_factory
.
Включить локализацию для полей с помощью
localized_fields
Используя localized_fields
можно включить локализацию для полей формы.
>>> AuthorFormSet = modelformset_factory( ... Author, fields=('name', 'title', 'birth_date'), ... localized_fields=('birth_date',))
Если в localized_fields
указать '__all__'
, будут локализированы все поля.
Передача начальных значений
Аналогично набору обычных форм, есть возможность указать начальные данные для форм набора, передав параметр initial
при создании экземпляра набора, возвращенного modelformset_factory()
. Тем не менее, в случае набора модельных форм, начальными значениями заполняются только пустые, т.е. новые, формы.
Сохранение объектов набора форм
Аналогично ModelForm
, вы можете сохранять данные в модели. Для этого надо использовать метод save()
набора форм:
# Create a formset instance with POST data. >>> formset = AuthorFormSet(request.POST) # Assuming all is valid, save the data. >>> instances = formset.save()
Метод save()
возвращает экземпляры объектов, которые были сохранены в базе данных. Те объекты, данные которых не изменились, не сохраняются в базе данных и не отображаются в возвращаемом значении (instances
из предыдущего примера).
Когда форма содержит не все поля модели (например, потому что некоторые из них были явно исключены), то отсутствующие поля не будут сохранены через метод save()
. Подробнее об этом ограничении модельных форм написано в Указываем какие поля использовать.
Передайте commit=False
, чтобы получить экземпляры моделей, которые ещё не сохранены в базе данных:
# don't save to the database >>> instances = formset.save(commit=False) >>> for instance in instances: ... # do something with instance ... instance.save()
Это позволяет вам добавлять данные к экземплярам моделей перед их сохранением в базе данных. Если ваш набор форм содержит ManyToManyField
, вам также потребуется вызвать метод formset.save_m2m()
для того, чтобы обеспечить сохранение связей «многие-ко-многим».
После вызова save()
, в класс набора форм будут добавлены атрибуты, содержащие все изменения:
-
models.BaseModelFormSet.
changed_objects
-
models.BaseModelFormSet.
deleted_objects
-
models.BaseModelFormSet.
new_objects
Ограничение количества редактируемых объектов
Как и в случае набора обычных форм, вы можете использовать аргументы max_num
и extra
функции modelformset_factory()
для ограничения числа дополнительно отображаемых форм.
Аргумент max_num
не препятствует отображению существующих объектов:
>>> Author.objects.order_by('name') [<Author: Charles Baudelaire>, <Author: Paul Verlaine>, <Author: Walt Whitman>] >>> AuthorFormSet = modelformset_factory(Author, fields=('name',), max_num=1) >>> formset = AuthorFormSet(queryset=Author.objects.order_by('name')) >>> [x.name for x in formset.get_queryset()] ['Charles Baudelaire', 'Paul Verlaine', 'Walt Whitman']
Если значение max_num
больше чем количество существующих объектов, то к будет добавлено extra
пустых форм к набору. Так будет происходить до достижения максимального количества форм, ограниченного параметром max_num
:
>>> AuthorFormSet = modelformset_factory(Author, fields=('name',), max_num=4, extra=2) >>> formset = AuthorFormSet(queryset=Author.objects.order_by('name')) >>> for form in formset: . .. print(form.as_table()) <tr><th><label for="id_form-0-name">Name:</label></th><td><input type="text" name="form-0-name" value="Charles Baudelaire" maxlength="100" /><input type="hidden" name="form-0-id" value="1" /></td></tr> <tr><th><label for="id_form-1-name">Name:</label></th><td><input type="text" name="form-1-name" value="Paul Verlaine" maxlength="100" /><input type="hidden" name="form-1-id" value="3" /></td></tr> <tr><th><label for="id_form-2-name">Name:</label></th><td><input type="text" name="form-2-name" value="Walt Whitman" maxlength="100" /><input type="hidden" name="form-2-id" value="2" /></td></tr> <tr><th><label for="id_form-3-name">Name:</label></th><td><input type="text" name="form-3-name" maxlength="100" /><input type="hidden" name="form-3-id" /></td></tr>
Присвоение max_num
значения None
(по умолчанию) устанавливает ограничение на количество отображаемых набором форм равное 1000. На практике это аналогично безлимитному количеству.
Использование набора модельных форм в представлении
Наборы модельных форм во многом похожи на наборы обычных форм. Для отображения набора форм для редактирования экземпляров модели Author
:
from django.forms import modelformset_factory from django.shortcuts import render_to_response from myapp.models import Author def manage_authors(request): AuthorFormSet = modelformset_factory(Author, fields=('name', 'title')) if request.method == 'POST': formset = AuthorFormSet(request.POST, request.FILES) if formset.is_valid(): formset.save() # do something. else: formset = AuthorFormSet() return render_to_response("manage_authors.html", { "formset": formset, })
Как вы можете видеть, логика представления не сильно отличается отличается логики обычного набора. Отличием является вызов formset.save()
для сохранения данных. (Это было описано ранее в Сохранение объектов набора форм.)
Переопределение
clean()
у ModelFormSet
Подобно ModelForms
, по умолчанию метод clean()
класса ModelFormSet
будет проверять все данные на нарушение ограничений уникальности, определённых в вашей модели (unique
, unique_together
или unique_for_date|month|year
). Желая сохранить данный функционал при переопределении метода clean()
, следует вызывать метод clean()
базового класса:
from django.forms import BaseModelFormSet class MyModelFormSet(BaseModelFormSet): def clean(self): super(MyModelFormSet, self).clean() # example custom validation across forms in the formset for form in self.forms: # your custom formset validation ...
На этом этапе уже будут созданы экземпляры модели для каждой формы. Поменяв form.cleaned_data
, вы не поменяете сохраняемые значения. Для этого в ModelFormSet.clean()
необходимо изменить form.instance
:
from django.forms import BaseModelFormSet class MyModelFormSet(BaseModelFormSet): def clean(self): super(MyModelFormSet, self).clean() for form in self.forms: name = form.cleaned_data['name'].upper() form.cleaned_data['name'] = name # update the instance value. form.instance.name = name
Использование собственной выборки
Как было сказано ранее, в можете переопределить стандартную выборку, которая используется набором модельных форм:
from django.forms import modelformset_factory from django.shortcuts import render_to_response from myapp.models import Author def manage_authors(request): AuthorFormSet = modelformset_factory(Author, fields=('name', 'title')) if request.method == "POST": formset = AuthorFormSet(request.POST, request.FILES, queryset=Author. objects.filter(name__startswith='O')) if formset.is_valid(): formset.save() # Do something. else: formset = AuthorFormSet(queryset=Author.objects.filter(name__startswith='O')) return render_to_response("manage_authors.html", { "formset": formset, })
Следует отметить, что мы передаём аргумент queryset
в обе ветки POST
и GET
в этом примере.
Использование набора форм в шаблоне
Существует три способа отображения набора форм в шаблоне Django.
Во-первых, вы можете позволить набору форм самому сделать всю работу:
<form method="post" action=""> {{ formset }} </form>
Во-вторых, в можете вручную вывести набор форм, но позволить его формам отображаться самостоятельно:
<form method="post" action=""> {{ formset.management_form }} {% for form in formset %} {{ form }} {% endfor %} </form>
При самостоятельном отображении форм, не забудьте отобразить техническую форму, как было показано выше. Обратитесь к документации на технические формы.
В-третьих, вы можете вывести все поля:
<form method="post" action=""> {{ formset.management_form }} {% for form in formset %} {% for field in form %} {{ field.label_tag }} {{ field }} {% endfor %} {% endfor %} </form>
Если вы предпочтёте третий способ и не будете использовать {% for %}
для итерации по полям, то вам понадобится вывести поле для первичного ключа. Рассмотрим случай, когда требуется вывести поля name
и age
модели:
<form method="post" action=""> {{ formset.management_form }} {% for form in formset %} {{ form.id }} <ul> <li>{{ form.name }}</li> <li>{{ form.age }}</li> </ul> {% endfor %} </form>
Обратите внимание на то, как мы явно выводим {{ form.id }}
. Это гарантирует, что набор модельных форм, в случае POST
, будет работать правильно. (Этот пример предполагает, что первичный ключ имеет имя id
. Если вы изменили имя первичного ключа, то учтите это в данном примере.)
Встраиваемые наборы форм
- class
models.
BaseInlineFormSet
Встраиваемые наборы форм являются небольшим абстрактным слоем над набором модельных форм. Они упрощают работу со связанными через внешний ключ объектами. Предположим, у вас есть следующие две модели:
from django.db import models class Author(models.Model): name = models.CharField(max_length=100) class Book(models.Model): author = models.ForeignKey(Author, on_delete=models.CASCADE) title = models.CharField(max_length=100)
Если вам требуется создать набор форм для редактирования книг, принадлежащих определенному автору, вы можете сделать следующее:
>>> from django.forms import inlineformset_factory >>> BookFormSet = inlineformset_factory(Author, Book, fields=('title',)) >>> author = Author. objects.get(name='Mike Royko') >>> formset = BookFormSet(instance=author)
Переопределение методов в
InlineFormSet
Переопределяя методы InlineFormSet
, лучше наследоваться от BaseInlineFormSet
, чем от BaseModelFormSet
.
Например, если вы хотите переопределить clean()
:
from django.forms import BaseInlineFormSet class CustomInlineFormSet(BaseInlineFormSet): def clean(self): super(CustomInlineFormSet, self).clean() # example custom validation across forms in the formset for form in self.forms: # your custom formset validation ...
Смотрите также Переопределение clean() у ModelFormSet.
Потом при создании набора форм укажите аргумент formset
:
>>> from django.forms import inlineformset_factory >>> BookFormSet = inlineformset_factory(Author, Book, fields=('title',), ... formset=CustomInlineFormSet) >>> author = Author. objects.get(name='Mike Royko') >>> formset = BookFormSet(instance=author)
Более одного внешнего ключа к одной модели
Если ваша модель имеет больше одного внешнего ключа на одну и ту же модель, вам следует разрешить эту путаницу, указав fk_name
. Например, рассмотрим следующую модель:
class Friendship(models.Model): from_friend = models.ForeignKey( Friend, on_delete=models.CASCADE, related_name='from_friends', ) to_friend = models.ForeignKey( Friend, on_delete=models.CASCADE, related_name='friends', ) length_in_months = models.IntegerField()
Чтобы разрешить эту неопределенность, вы можете использовать fk_name
в inlineformset_factory()
:
>>> FriendshipFormSet = inlineformset_factory(Friend, Friendship, fk_name='from_friend', ... fields=('to_friend', 'length_in_months'))
Использование вторичного набора форм в представлении
Вам может понадобиться создать представление, которое позволит пользователю редактировать связанные объекты модели. Вот как это можно сделать:
def manage_books(request, author_id): author = Author.objects.get(pk=author_id) BookInlineFormSet = inlineformset_factory(Author, Book, fields=('title',)) if request.method == "POST": formset = BookInlineFormSet(request.POST, request.FILES, instance=author) if formset.is_valid(): formset.save() # Do something. Should generally end with a redirect. For example: return HttpResponseRedirect(author.get_absolute_url()) else: formset = BookInlineFormSet(instance=author) return render_to_response("manage_books.html", { "formset": formset, })
Следует отметить, что мы передаём instance
в обоих (POST
и GET
) случаях.
Модель форма и размеры — Справочник химика 21
В области течения выбирают направление скорости набегающего потока ш , по оси X, а тело устанавливают под заданным углом атаки а (рис. 8.6). Приближенно принимается, что возмущение от тела распространяется в области течения на расстоянии от тела, равном примерно пятикратному размеру тела в рассматриваемом направлении. При обтекании одиночного тела область течения берется прямоугольной формы с размерами 1. по оси х и Ьц по оси у. Проводящую область на электрической модели с размерами и и моделью тела [c.403]Использованная модель двумерного поликристалла, состоящего из зерен квадратной формы размером 6, и двух ортогональных рядов границ зерен, представлена на рис. 2.24 [210]. Предполагается, [c.107]
Обычно в тропосферных моделях задают размеры частиц (средний радиус г), их счетную концентрацию и удельную поверхность 5уд. При этом чаще всего исходят из предположения о сферической форме частиц. Тогда [c.144]
Зная расстояния между атомами и углы между связями, можно в простых случаях построить модель молекулы органического вещества и, таким образом, определить ее форму и размеры. При построении модели необходимо помнить, что углеродная цепь молекулы (например, углеводородов парафинового ряда) представляет собой ломаную линию, вследствие чего часть длины молекулы, приходящаяся на один атом углерода, меньше его ковалентного радиуса. Если принять, что ковалентный радиус равен [c.64]
Закачка 0,067-0,105 п.о. товарной формы СТЛ полностью прекращает фильтрацию жидкости через модели пласта — латекс отлагается в торце модели пласта. Размер буфера пресной воды перед оторочкой СТЛ не влияет на результат эксперимента. Более разбавленные растворы СКС-65 ГПБ проникают в пористые среды, причем во всех опытах латекс наблюдается на выходе из моделей пласта. Концентрация латекса сильно влияет на фильтрационное сопротивление пористых сред. Так, при закачке 10, 15 и 20% растворов СТЛ значения максимальных факторов сопротивления равны 580, 1000 и 40000 соответственно. Остаточные фильтрационные сопротивления составляют 5.8, 15.8 и 5500 соответственно (см. табл.19). Таким образом, ре- [c.78]
Рибонуклеаза по модели, описанной Картой и полученной с разрешением 0,2 нм в результате синтеза Фурье для семи различных производных с тяжелыми атомами (7294 измерения), представляет собой молекулу почкообразной формы размером 3,8 X 2,8 X 2,2 нм. Активный центр фермента находится в почечной борозде — характерной щели, разделяющей молекулу иа две половины и содержащей ответственные за каталитическую активность остатки гистидина (положения 12 и 119) и лизина (положения 41 и 7). [c.402]
Уравнение (5.1) должно быть дополнено известными граничными, откуда следует влияние геометрических размеров, и начальными условиями, а а случае конвективного теплообмена также должна соблюдаться непрерывность потока и сохраняться масса вещества. Решая (5.1) для моделей конкретных технических систем источник нагрева — контролируемый объект , можно рассчитать распределение температур по контролируемому объекту и особенно на его поверхности в зависимости от его формы, размеров и других параметров, а также от наличия дефектов, что позволяет судить об их качестве. [c.169]
Наиболее полно изучены зоны аэродинамических теней бесконечных цилиндрических тел и прямоугольных тел (промышленных и жилых зданий). Зоны аэродинамических теней цилиндров конечной длины, расположенных близко друг от друга, не изучены. Этим и была продиктована необходимость проведения специальных лабораторных исследований на модели резервуарного парка, расположенного в аэродинамической трубе [50]. При исследованиях на моделях использовали визуальные наблюдения, фотографирование и зарисовку воздушных потоков по отклонениям шелковинок и дымовых струек, по которым судили о характере изменения скорости и направления воздушного потока около одиночного резервуара и группы резервуаров, а также определяли формы и размеры аэродинамической тени при различных скоростях ветра (рис. 16). [c.147]
Одним из представителей этой группы сорбентов является полисиликат натрия (ПС) с кристаллами в виде тонких пластинок правильной прямоугольной формы размером (2-н6)-10 м. Характерной особенностью кристаллов ПС и полученных на их основе путем кислотной обработки кристаллических поликремниевых кислот (ПК) является лабильность решетки, выражающаяся в том, что формирование пористой структуры происходит непосредственно в процессе сорбции молекул или ионов. (Возможно, что этот вид адсорбции в щелевидных микропорах, возникающих или проявляющихся в результате адсорбционного взаимодействия, потребует специального описания и модели.) [c.70]
Схема контактной ступени этого аппарата показана на рис. 78. В этой конструкции основным элементом является отбойник (купол) дугового профиля. Купол расположен вогнутостью вниз, что обеспечивает закручивание потока. Жидкость приходит во вращение вместе с газовым потоком и центробежной силой отбрасывается в карман. Пар, освобожденный от жидкости, направляется в следующую контактную ступень, где инжектирует жидкость, поступающую из кармана в щель, образованную стенкой кармана и пластиной. Контакт пара и жидкости осуществляется как в куполе, так и в сепарационном пространстве. К сожалению, опыты с этой конструкцией были произведены на модели малого размера (75—100 мм, форма прямоугольная). Скорость пара в щели для выпуска жидкости составляла 15— 25 м/сек при размерах щелей 8—14 мм. Опыты показали, что при расстоянии между ступенями 250 мм унос может быть подсчитан по следующему уравнению [c.130]
ОН 27-221—012-68 Заготовки и детали пакетов для изготовления изделий из реактопластов. Конструкция и размеры Пресс-формы для выплавляемых моделей. Основные размеры Пресс-формы для выплавляемых моделей. Шероховатость поверхностей [c.106]
Очевидно, что с позиций такой модели для нахождения корреляций между структурой и свойствами материала следует в отличие от модели бахромчатой мицеллы исходить уже из других параметров. Безусловно, что размеры кристаллических структур, форма, размеры и характер упаковки элементарных структурных элементов должны играть определяющую роль в поведении и свойствах кристаллических полимерных материалов. [c.46]
Коэффициент асимметрии z определяется выражением Z = /(В)//(я-е) — отношением интенсивностей рассеяния под углами, симметричными относительно 90°. По мере увеличения размера молекул z тоже возрастает для любой выбранной величины 0. Если принять, что форма молекулы полимера соответствует одной из упомянутых выше теоретических моделей, то размер молекул можно непосредственно связать с коэффициентом асимметрии. Используя соответствующие выражения для Р(9), рассчитывают отношение Р(0)/Р(я-в) для серии величин Dl% прр различных углах 9. Для вычи [c.185]
При конструировании вначале исходят из деревянной, гипсовой или металлической модели, наружные размеры которой соответствуют размерам формуемого изделия. В плоскости разъема формы расположено специальное кольцевое ребро, обеспечивающее плотное закрывание формы и позволяющее избежать попадания воздуха в изделие и утечек смолы из формы при прессовании (рис. 1). [c.373]
Реакторы, применяемые в технологии синтеза полимеров и синтетических каучуков, отличаются большим разнообразием форм, размеров и конструкций. Однако для анализа их удобно разделить на несколько основных и промежуточных моделей, что позволяет получить представления об особенностях их работы. [c.291]
По корпускулярной теории строения адсорбентов [2, 3, 4, 5] силикагель и алюмогель состоят из первичных скрепленных менаду собой частиц с различной степенью их упаковки. Зазоры между частицами представляют собой поры, заполненные в процессе адсорбции и капиллярной конденсации адсорбатом и обусловливающие гистерезисную петлю на изотерме. Размеры частиц (В), составляющих остов силикагеля и алюмогеля, не трудно рассчитать, приняв определенную модель формы частиц (см. табл. 1). Эти величины близки к значениям, полученным из электронно-микроскопических снимков и из расчета уширений линий на рентгенограмме (для кристаллических однофазных адсорбентов). [c.244]
В ряде случаев достаточно эффективной может быть методика, позволяющая получить объемную модель порового пространства. Эта методика предусматривает заполнение пор текучим веществом, которое после своего затвердевания и удаления основного материала (например, травлением) образует губчатую структуру, достаточно точно воспроизводящую форму, размеры, пространственное расположение поровых каналов. [c.392]
Классификация теории горения по уровням. Инженерная практика. Теория горения в данной книге изложена на следующих трех уровнях инженерная практика математические модели фундаментальные науки. Первый уровень предусматривает описание оборудования, принципов его действия, а также желательных и нежелательных особенностей функционирования. Этот уровень можно также назвать эксплуатационно-конструкторским. Потребители оборудования заинтересованы в его хорошей работе, а внимание конструктора концентрируется на вопросах влияния формы, размеров, материалов и т. д. на характеристики работы. [c.9]
Рассмотрим агрегат, состоящий из зерен минералов А и В кубической формы одного размера а, которые размещены, как это описано в случайной модели раскрытия. Когда агрегат разрушается по случайной решетке,, параллельной решетке размещения зерен минералов, с образованием меньших частиц кубической формы размером р, среднее количество частиц, образованных из одного зерна, равно где Л — отношение размера зерна минерала к размеру частицы [c. 196]
Исторически в исследованиях наибольшее распространение получил метод физического моделирования, согласно которому связи между физическими величинами устанавливаются только в пределах данного класса явлений. В таком случае основные уравнения, опис ыв щие процесс, преобразуются в группу критериев подобия, которые являются инвариантными к масштабам реактора. Это позволяет результаты исследований на модели переносить (масштабировать) на промышленный аппарат. Поскольку химический процесс характеризуется одновременно р личными классами физических и химических явлений, то при физическом моделировании его с изменением масштаба физической модели реактора инвариантности критериев подобия достичь не удается. Стремление сохранить при изменении масштабов постоянство одних критериев приводит к изменению других и в конечном счете к изменению соотношения отдельных стадий процесса. Следовательно, перенос результатов исследования с модели реактора на его промышленные размеры становится невозможным. При математическом моделировании указанное ограничение автоматически снимается, так как необходимости в переходе от основных уравнений к форме критериальной зависимости здесь нет, нужно иметь лишь описание химического процесса, инвариантного к масштабам реактора. При этом количественные связи, характеризующие процесс, отыскиваются в форме ряда чисел, получаемых как результат численного решения на электронных вычислительных машинах. [c.13]
Формы, размеры и конструкции теплиц весьма разнообразны и удовлетворяют большинству пожеланий садоводов. Обычно начинающему садоводу сложно сориентироваться во всем многообразии предлагаемых моделей. Поэтому при выборе теплицы прежде всего принимают во внимание ее назначение на садовом участке, а также сумму выделенных на нее средств. [c.10]
Описанные модели носят общий характер, и основанием для них послужили данные, полученные на мембранах самой различной природы, что нельзя считать правомерным. Проверка унитарной модели мембран, а также другие многочисленные экспериментальные данные показали, что биологические мембраны очень сильно отличаются как по химическому составу, так и по форме, размерам, структурной организации и биологическим функциям. Поэтому целесообразно моделировать мембраны соответственно их функциям (например, мембраны плазматические, митохондриальные, ядерные и т. п.), с последующей экспериментальной проверкой именно этих конкретных моделей. [c.38]
Для определения напряженно-деформированного состояния применяют упрощенные, схематизированные модели формы элементов конструкций. Основной геометрической моделью сопротивления материалов является стержень-тело, поперечные размеры [c.18]
Повышенное или пониженное значение плотности прочно связанной воды по сравнению с обычной жидкой водой будет зависеть от того, какой из двух факторов — усиление энергии связи или разупорядочивающее влияние подложки — окажется преобладающим. Для слоистых силикатов (см. табл. 2.2),кремнезема [87], цеолита NaX [88] плотность адсорбированной воды выше единицы. Это обусловлено высокой энергией связи при относительно небольшом разупорядочивающем влиянии подложки. Последнее объясняется хорошим структурным соответствием между узором поверхностных атомов кислорода (и гидроксильных групп в случае кремнезема) слоистых силикатов и кремнеземов, с одной стороны, и элементами структуры воды — с другой. Недаром получившая широкое распространение первая модель структуры адсорбированной слоистыми силикатами воды представляла собой плоский вариант структуры льда [89]. Н. В. Белов подметил идентичность формы и размеров полостей цеолита X и крупных додекаэдрических молекул воды Н20 20аоснове этого предположил, что [c.35]
По мере перехода к молекулам, центральный атом в которых имеет все большие размеры, электроны на валентных орбиталях в среднем располагаются все дальше друг от друга. Поэтому межэлектронные отталкивания оказывают все меньшее влияние на форму молекул. Например, атом серы имеет больший эффективный размер, чем атом кислорода, а атомные спектры свидетельствуют о том, что межэлектронное отталкивание для валентных орбиталей серы значительно меньше, чем для валентных орбиталей кислорода. По-видимому, по этой причине валентный угол Н—S—Н в молекуле сероводорода H S равен 92°, что намного ближе к значению 90% предсказываемому в рамках модели связывания, основанной на перекрывании (Зр + lsl-орбиталей (рис. 13-17). Очевидно, отталкивание двух связывающих электронных пар в h3S значительно меньше отталкивания двух связывающих электронных пар в HjO. [c.564]
Самая простая качественная модель учитывает только одну характеристику модели — ее размер. Модель жесткой упругой сферы явилась огромным достижением ранней кинетической теории. Эту сверхупрощенную модель можно модифицировать следующим образом придать сфере некоторую мягкость , добавить потенциал притяжения, изменить форму и размер и ввести несферичность или использовать любую комбинацию этих факторов. В данном разделе обсуждаются некоторые из этих моделей, однако для достижения настоящего успеха необходимо использовать теорию межмолекулярных сил, которая будет рассмотрена в разд. 4.4. [c.174]
В [4] эта модель развита для учета формы, размера частицы и распределения частиц по размерам вдоль длины перемешивания. Разбив сложное обш,ее турбулентное течение в плотноупакованном слое на сумму индивидуальных поднотоков, автор [4] получил [c.436]
Предложена классификация пористых структур, основанная на изучении детального строения пористых тел (элементов, из которых они состоят, их формы, размеров и взаимного расположения). Рассмотрены с этой точки зрения вашнейшие типы дисперсных и пористых тел, строение которых сведено к пяти моделям (глобулярная, щелевидные поры, набор круглых стержней, цилиндрические капилляры, бутылкообразные поры). [c.355]
В соответствии с условиями производства и по согласованию с отраслевым ЦК профсоюза, костюмы допускается изготовлять по техническому описанию на модель, отвечающему требованиям стандарта. Для конкретных условий костюмы можно изготовлять в комплекте с головными уборами различного вида защитными накладками, настроченными или съемными, различной формы, размера, расположения без защитных накладок с кокеткой спинки, переходящей в полочки с полочками и боковыми внутренними карманами с напульсниками на рукавах с воротником стойкой с нижним воротником из бязи или фланели (тип В) с различного вида вентиляционными отверстиями (типа блочёк, щелевых, ромбовидных) с подкладкой по всей длине в куртке и брюках (тип В) с внутренним боковым карманом в брюках с [c.51]
В соответствии с условиями производства и по согласованию с ЦК профсоюза, костюм допускается изготовлять по техническому описанию на модель, отвечающую требованиям стандарта. Для конкретных условий костюмы можно изготовлять в комплекте с головным убором с защитными накладками, настроченными, или съемными, различных форм, размеров, расположения и числа без защитных накладок с воротником стойкой с различного вида вентиляционными отверстиями (типа блочек, щелевидных, ромбовидных) с карманами в боковых швах и швах настрачивания накладки переда с полочками и боковыми внутренними карманами, с напульсниками на рукавах. Для изготовления костюмов используют следующие ткани молескин гладкокрашеный с пропиткой ТО (ГОСТ 11209—72) ткань суконную полушерстяную арт. 49212. [c.52]
При обработке форм до извлечения модели углекислоту подают через модель, имеющую центральный канал диаметром 5—8 мм. От этого канала идет ряд накалов диаметром 2—Зльи, заканчивающихся у наружных стенок модели. Применяют также и другой способ, заключающийся в том, что вокруг модели, на расстоянии 25—40 мм от нее, через 120—150 мм делают наколы диаметром 8—10 мм. Через эти наколы форму продувают углекислотой с помощью набора сопел с выходными отверстиями диаметром 6—8 мм. При обработке после извлечения моделей форму покрывают зонтом (небольшим деревянным ящиком или колпаком), к которому подводится углекислота. Продолжительность продувки зависит от размера формы и составляет от 1 до 8 минут. [c.193]
Рассмотрение молекулярных моделей таких соединений, относящихся к семи первичным запахам, привело Эймура к предположению, что наиболее существенными факторами, определяющими запах, являются форма, размеры, а в некоторых случаях электронное строение молекул. [c.152]
Приборы. Воронки для встряхивания, или делительные воронки, имеют одну из форм, изображенных на рис. 57 и 58. Модели меньших размеров часто употребляются в качестве капельных воронок, и затруднения могут возникнуть только тогда, когда трубка воронки слишком сужена. Воронки для встряхивания емкостью примерно до 1 л обыкновенно выдуваются на горелке. Воронки больших размеров с более толстыми стенками делаются из литого стекла грушевидной или цилиндрической формы. Необходимы хорошо пригнанные шлифы, так как растворители, применяемые для извлечения, растворяют смаз1су. [c.85]
Современные вычислительные комплексы, используемые в САПР и АСТПП, способны передавать данные о конструкции и технологии производства изделий прямо в ЭВМ, управляющие станками и технологическими установками. За счет этого процесс проектирования изделия, технологическая подготовка производства и собственно изготовление изделия соль- ются в одну систему, работа которой будет обеспечена многими взаимосвязанными ЭВМ. Таким образом, разработка конструкций, технологии и управления технологическими процессами производства от начала и до конца будет осуществлена ЭВМ, объединяющей все функции, выполняемые предприятием, на основе общего банка данных. В таких системах конструктор использует ЭВМ для построения геометрической модели, описывающей размеры и форму детали, требования к допускам, шерохо- [c.177]
Влияние гиГжости цепей в полной мере проявляется лишь при достаточной длине цепей. Слишком короткие цепи слегка изгибаются, но вследствие ограничения изгибов величиной валентных углов они все же не отклоняются сильно от формы вытянутых палочек. По мере удлинения цепи (т. е. увеличения молекулярного веса) изгибы цепей все более приближают молекулы к свернутой форме, и в конце концов образуется модель беспорядочно свернутого клубка растворитель обтекает такую молекулу подобно тому, как обтекает сплошную твердую частицу эквивалентной формы. Размеры и форма клубка могут изменяться при изменении состава среды, так как взаимодействие с растворителем (сольватация) изменяет гибкость цени. [c.260]
Готовые пленки разрезали на образцы прямоугольной формы размером 10×140 мм и вклеивали в бумажную рамку, аналогичную применяемым при испытании стеклянных волокон. Рабочая длина образца —100 мм. Соотношение ширины и длины образца 1 10 обеспечивало получение однородного поля, исключение влияния граничных условий. Это подтверждалось картиной изохром, полученных в поляризованном свете на эпоксидной модели, а так- [c.124]
Для определения напряженно-деформированного состояния применяют упрощенные, схематизированные модели формы элементов конструкций. Основной геометрической моделью сопротивления материалов является стержень-тело, поперечные размеры которого малы по сравнению с его длиной. В качестве модели формы для расчета трубопроводов технологической обвязки компрессорных станций принимается плоскопространственная тонкостенная стержневая рама с распределенными массами. Упругая ось трубопровода в недеформированном состоянии прямолинейна и совпадает с линией центров тяжести поперечных сечений. Перемещения точек трубопровода, обусловленные его упругими деформациями, весьма малы по сравнению с размерами самого трубопровода. [c.4]
На станке модели СТ00Б-1Н отбортовывают наружный борт обечаек для корпусов стальной эмалированной аппаратуры и корпусов из нержавеющей стали. На рис. 46 показаны размеры обечайки. На сварной раме 27 станка (рис. 47) установлены нижний вал 7 со стойками 3 и 16. Вращение нижнему валу (10,6 об/мин) передается от электродвигателя 18 мощностью 20 кВт через редуктор РМ-750 и клиноременную передачу. Оси нижнего и верхнегд 6 валов размещены в вертикальной плоскости. На нижнем валу расположены два ролика 24 и один формующий ролик 10, а на верхнем 6 — три ролика 8. Обечайка зажимается между роликами 24 и 8 при вращении верхнего вала, подшипники которого могут перемещаться в вертикальном направлении в стойках 3 VI 16 от электродвигателя 19 мощностью [c.92]
Заявление о государственной регистрации полезной модели и выдачи патента на полезную модель, его дубликата
Формы документов/бланков/заявлений для государственной регистрации полезной модели и выдачи патента на полезную модель, его дубликата.
Сведения об утверждении
приказ Минэкономразвития РФ от 30.09.2015 № 701
Форма бланка
Заявление о выдаче патента на полезную модель — DOC,
Примеры заполнения заявления
Для физического лица (PDF)
Для юридического лица (PDF)
Ходатайство о признании права конвенционного приоритета
Ходатайство о признании права конвенционного приоритета (DOC)
Ходатайство о внесении изменений в документы заявки — описание полезной модели, формулу полезной модели, чертеж (чертежи), иные материалы, реферат
Ходатайство о внесении изменений в документы заявки — описание полезной модели, формулу полезной модели, чертеж (чертежи), иные материалы, реферат (DOC)
Ходатайство о внесении изменений в заявление о выдаче патента в связи с изменением имени автора, имени или наименования заявителя, представителя заявителя, адреса
Ходатайство о внесении изменений в заявление о выдаче патента в связи с изменением имени автора, имени или наименования заявителя, представителя заявителя, адреса (DOC)
Ходатайство о внесении изменений в заявление о выдаче патента в связи с передачей права на получение патента другому лицу
Ходатайство о внесении изменений в заявление о выдаче патента в связи с передачей права на получение патента другому лицу (DOC)
Ходатайство о внесении изменений в заявление в связи с реорганизацией заявителя — юридического лица или переходом права к другому лицу по наследству
Ходатайство о внесении изменений в заявление в связи с реорганизацией заявителя — юридического лица или переходом права к другому лицу по наследству (DOC)
Ходатайство о внесении изменений в заявление о выдаче патента в связи с изменением состава авторов
Ходатайство о внесении изменений в заявление о выдаче патента в связи с изменением состава авторов (DOC)
Ходатайство об исправлении очевидных и технических ошибок
Ходатайство об исправлении очевидных и технических ошибок (DOC)
Ходатайство о продлении срока представления запрашиваемых документов
Ходатайство о продлении срока представления запрашиваемых документов (DOC)
Ходатайство о восстановлении пропущенного срока представления запрашиваемых документов
Ходатайство о восстановлении пропущенного срока представления запрашиваемых документов (DOC)
Заявление об отзыве заявки
Заявление об отзыве заявки (DOC)
Заявление о преобразовании заявки на полезную модель в заявку на изобретение или в заявку на промышленный образец
Заявление о преобразовании заявки на полезную модель в заявку на изобретение или в заявку на промышленный образец (DOC)
Ходатайство о предоставлении права на освобождение от уплаты пошлины или на уплату пошлины в уменьшенном размере
Ходатайство о предоставлении права на освобождение от уплаты пошлины или на уплату пошлины в уменьшенном размере (DOC)
Ходатайство о зачете средств, поступивших в уплату пошлины, или излишне уплаченной суммы патентной пошлины
Ходатайство о зачете средств, поступивших в уплату пошлины, или излишне уплаченной суммы патентной пошлины (DOC)
Ходатайство о возврате средств, поступивших в уплату патентной пошлины, или излишне уплаченной суммы патентной пошлины
Ходатайство о возврате средств, поступивших в уплату патентной пошлины, или излишне уплаченной суммы патентной пошлины (DOC)
Ходатайство о выдаче дубликата патента на полезную модель
Ходатайство о выдаче дубликата патента на полезную модель (DOC)
Django forms-поле формы для каждой модели
Я застрял с проблемой — я хочу добавить простое поле формы для редактирования объектов,которые я просматриваю в шаблоне. Вот моя модель:
class Topic(BaseModel):
name = models.TextField()
Вот моя модель формы:
class TopicForm(forms.ModelForm):
class Meta:
model = Topic
fields = ["name"]
И вот мои взгляды:
def App(request):
tname = Topic.objects.get(pk=1)
if request.method == "POST":
form = TopicForm(data = request.POST, instance=tname)
if form.is_valid():
form.save()
И мой шаблон прост:
{% for lecture in lectures %}
<form action="/app/" method="POST">
{% csrf_token %}
{{ form }}
<input type="submit" value="Post">
</form>
{% endfor %}
Дело в том, что я хочу иметь поле формы для редактирования модели EACH, а не только ту, которая имеет pk 1… как мне это сделать ?
python django formsПоделиться Источник Eimantas 18 января 2014 в 17:52
2 ответа
- Django поле формы для списка строк
Мне нужно поле формы Django, которое будет принимать список строк. Я повторю этот список и создам новый объект модели для каждой строки. Я не могу сделать поле множественного выбора модели , потому что объекты модели не создаются до тех пор, пока не будет отправлена форма , и я не могу сделать…
- Django ForeignKey поле формы: отображаемое значение
Может быть, у меня просто мозговой пердеж, но я серьезно не могу понять этого. Как получить отображение значений полей ForeignKey из связанной формы в шаблоне? {{ field }} отображает виджет, {{ field.value }} возвращает pk , и мне нужна сама модель. Я пишу пользовательский шаблон для…
1
Я думаю, что вам нужно сделать objects.all()
вместо get(pk=1)
. Затем выполните цикл над этими объектами и сохраните их в списке, который вы сохраните в контексте. Что-то вроде этого:
tnames = Topic.objects.all()
lectures = []
for tname in tnames:
lectures.append(TopicForm(instance=tname))
context = {
'lectures' : lectures
}
Поделиться bozdoz 18 января 2014 в 17:58
Поделиться faph 18 января 2014 в 18:33
Похожие вопросы:
Django поля формы: представляют значения полей как модельное поле помимо PK?
Возможно ли, чтобы поле формы Django представляло значения формы в виде слизней (например, <input value=groceries> ) вместо IDs ( <input value=1> ) без существенного переписывания…
Получить поле формы Django из поля модели
Я хотел бы создать форму, которая включает в себя поля из двух отдельных моделей, а также некоторые другие обычные (немодельные) поля. Форма создаст экземпляр каждой модели. Я не думаю , что могу…
Django forms с внешними ключами
У меня есть сценарий, в котором пользователь может иметь несколько книг. Я могу создать две разные модели для пользователя и книг и связать их с помощью внешних ключей (или one-to-many будет…
Django поле формы для списка строк
Мне нужно поле формы Django, которое будет принимать список строк. Я повторю этот список и создам новый объект модели для каждой строки. Я не могу сделать поле множественного выбора модели , потому…
Django ForeignKey поле формы: отображаемое значение
Может быть, у меня просто мозговой пердеж, но я серьезно не могу понять этого. Как получить отображение значений полей ForeignKey из связанной формы в шаблоне? {{ field }} отображает виджет, {{…
Django: необязательное поле формы модели
У меня есть модельная форма в моем приложении, и я хочу, чтобы два поля моей модельной формы были необязательными, то есть пользователи могли бы оставить эти два поля формы пустыми, и проверка формы…
Django forms настройка меток полей формы модели
Я пытаюсь настроить метку для формы модели django: class SupplyTypeForm(forms.ModelForm): class Meta: model = EUser fields = (‘service_type’, ‘online_account’) labels = { ‘online_account’: _(‘Do you…
Какое поле модели Django я использую для формы checkbox?
Я создал форму HTML и теперь подключаю ее к Django. (Я знаю, что должен был использовать Django для создания формы, но в данном случае я этого не сделал). В моем models.py я использую CharField для…
Как заменить поле формы пользовательским макетом в Django?
У меня есть поле формы модели, которое является полем выбора. Вместо того чтобы иметь виджет по умолчанию: Я хотел бы иметь сетку карт вот так: С каждым из вариантов, которые были бы в виджете по…
Как разбить одно поле формы на несколько полей модели в django?
Этот вопрос похож на Использование нескольких полей ввода для одного атрибута model’s с django и Как отобразить два поля формы как одно поле в Django forms? То, что мне нужно, в основном…
Модель 990.27 фланцевое присоединение EN 1092-1 форма В1
Модель 990.27 фланцевое присоединение EN 1092-1 форма В1
Типовой лист | DS 99.27 |
Монтаж датчика напрямую с разделителем или через капиллярную проводку | |
Особенности | Монтируется с датчиком тип S-10, кл. 0,5 (0,25)% |
DN | Номинальные размеры мембраны (см. таблицу) |
Части, контактирующ. с изм.средой | см. таблицу |
Передающая жидкость | KN 17, KN 32 |
Расчетное давление: | PN 25/40 |
Температура изм. среды: -50…+180*С | KN 17 |
Температура изм. среды: -20…+300*С | KN 32 |
Модель датчик давления+разделитель | присоединение к процессу DN/ материал | Диапазон датчика, бар | Цена без НДС |
S-10+990.27 | DN 50 316L | -1…0 (1,5; 3; 5; 9) 0…1 (1,6; 2,5; 4; 6; 10; 16; 25; 40) | € 433,66 |
S-10+990.27 | DN 50 316L/HC276 | -1…0 (1,5; 3; 5; 9) 0…1 (1,6; 2,5; 4; 6; 10; 16; 25; 40) | € 465,25 |
S-10+990.27 | DN 50 316L/PTFE | -1…0 (1,5; 3; 5; 9) 0…1 (1,6; 2,5; 4; 6; 10; 16; 25; 40) | € 488,33 |
S-10+990.27 | DN 50 316L/TANTAL | -1…0 (1,5; 3; 5; 9) 0…1 (1,6; 2,5; 4; 6; 10; 16; 25; 40) | € 564,85 |
S-10+990.27 | DN 80 316L | -1…0 (1,5; 3; 5; 9) 0…1 (1,6; 2,5; 4; 6; 10; 16; 25; 40) | € 471,32 |
S-10+990.27 | DN 80 316L/HC276 | -1…0 (1,5; 3; 5; 9) 0…1 (1,6; 2,5; 4; 6; 10; 16; 25; 40) | € 570,93 |
S-10+990.27 | DN 80 316L/PTFE | -1…0 (1,5; 3; 5; 9) 0…1 (1,6; 2,5; 4; 6; 10; 16; 25; 40) | € 545,42 |
S-10+990.27 | DN 80 316L/TANTAL | -1…0 (1,5; 3; 5; 9) 0…1 (1,6; 2,5; 4; 6; 10; 16; 25; 40) | € 630,45 |
Дополнительные опции (под заказ) | |
Повышенный класс точности датчика давления 0,25% | € 42,52 |
Монтаж через охлаждающий элемент (от 100-250*С) | € 51,02 |
Монтаж через капиллярную трубку за метр | € 17,01 |
Калибровочный протокол (по 5-ти точкам) | € 18,22 |
ВНИМАНИЕ!!! на складе в Москве поддерживаются датчики 6; 10; 16; 25 бар (класс точности 0,5%), срок поставки остальных диапазонов по запросу.
Мастер модель своими руками для снятия силиконовой формы для отливки гипсом
Что такое мастер-модель
Мастер-моделью называют образцовую деталь или изделие, которая используется для последующего ее копирования.
Например, вы решили украсить дом десятью фигурками. Можно десять раз вырезать их из дерева или слепить из пластилина, но, во-первых, это долго, во-вторых, крайне сложно сделать десять одинаковых фигурок. Гораздо проще сделать одну и затем скопировать ее.
Вот эта первая, «идеальная» фигурка и называется мастер-моделью.
Варианты использования мастер модели в гипсовой отрасли
Гипс простой в обработке, удобный и распространенный материал, замены которому пока не существует.
Он используется в строительстве, ювелирной и керамической отраслях, архитектуре, скульптуре и медицине..
Понадобятся мастер-модели для создания украшений, купажа, при производстве керамики или предметов интерьера: ваз, подставок. Скульптур и даже лепного декора.
Разумеется, для разных нужд нужны разные мастер-модели и специальный гипс. Для стоматологии используется медицинский гипс (https://samaragips.ru/catalog/meditcinskii-gips/), и мастер-модель должна быть идеальна.
Совсем другого отношения требует гипс строительный(https://samaragips.ru/catalog/stroitelnyi-gips/). Хотя даже для создания украшений для дома, например, нескольких декоративных фигурок следует уделить много внимания мастер-модели.
Мастер модель своими руками
Существует много различных вариантов материала для мастер-модели, если вы намерены сделать ее самостоятельно.
Самые распространенные: пластилин или воск, глина, дерево или металл.
Мастер-модели из пластилина, воска и глины часто выбирают для «домашнего» производства. Материалы податливые и легко поддаются дополнительной обработке, то есть если у вас сразу не вышла эталонная модель, вы можете ее доработать.
Тем не менее именно это свойство многие мастера считают также и недостатком материалов: материал податлив и любая дополнительная обработка или неосторожность может испортить модель.
При работе с такими материалами используются наборы для ручной работы: напильники, лобзики, бормашины.
После завершения работы, пластилин и некоторые виды глины оставляют на несколько дней для затвердевания. Глина в основном обжигается в керамической печи (в домашних условиях иногда используются духовые плиты). И для пластилина, и для глины, и для воска нужно учитывать усадку материала после затвердевания или обжига.
С деревом работать немного сложнее. Для сложных или массивных форм нередко нужно использовать станки или создавать модель из нескольких частей при помощи инструментов, склеивая их между собой, обязательно подбирая клей и учитывая его особенности. Финальная обработка поверхности перед заливкой формы с одной стороны проще благодаря прочности материала, с другой – дольше по времени.
Металл особенно в домашних условиях требует обязательного использования специальных инструментов, нужен прокат материала, обработка на станке, отлив. Однако многие специалисты предпочитают работать именно с металлом из-за прочности изделий и минимальной внешней обработки.
Мастер модель на 3д принтере
Из-за высоких требований к мастер-модели многие мастера, даже если речь идет об изделиях «для себя», прибегают к современным технологиям и печатают «эталон» на 3D принтерах или создают при помощи фрезерных станков с ЧПУ (числовое программное управление).
В обоих случаях перед работой понадобится 3D-модель изделия, то есть нужно или найти подходящую форму, или создать ее самому, или заказать у специалистов. Разумеется, такой способ дороже описанных выше.
Работа с 3D принтерами становится все популярнее благодаря скорости, простоте и высокой точности моделей, не требующих последующей обработки поверхности.
Для 3D печати используются воск, пластик, полимеры (гипсополимер, фотополимерная смола) или металлы. Выбор материала важен и зависит от ваших целей.
Например, воск или гипсополимер достаточно хрупкие, но позволяют делать очень точные модели. Эти материалы подходят для изготовления предметов искусства, маленьких фигурок, архитектурных элементов.
Пластик или фотополимерная смола прочнее, можно создавать более крупные модели, обычно используются для изготовления сувениров или прототипов каких-нибудь деталей, чтобы проверить их гибкость/прочность.
К металлу же прибегают, когда требуется крайне прочный или сложный по виду образец. Потому металл используется в инженерии или медицинском протезировании.
Почти все компании, занимающиеся 3D печатью, предлагают также и предварительное моделирование или помощь в нем.
Например:
https://www.cubicprints.ru/
https://can-touch.ru/
https://top3dshop.ru/
Мастер модель из готового изделия
Естественно вы можете использовать для литья и уже готовое изделие как в качестве 3D модели, так и для отливки «эталона». То есть для образца берется любая уже готова фигурка, деталь или форма и заливается силиконом. Существуют также специализированные сайты и форумы, где продаются самые разные подходящие изделия, а иногда уже и мастер-модели или даже услуги по их изготовлению.
Например:
https://www.livemaster.ru/
https://freelance.youdo.com/freelancers/frilanseri-3D-modelirovanie/
http://forum.rcdesign.ru/
типовая форма — Translation into English — examples Russian
These examples may contain rude words based on your search.
These examples may contain colloquial words based on your search.
На первых двух совещаниях Целевой группы были разработаны руководящие принципы и типовая форма для кратких докладов.
The guidelines and template for summary reports were elaborated during the first two meetings of the Task Force.с) при получении свидетельских показаний не использовалась официальная типовая форма;
(c) A formal template was not used when obtaining statements from witnesses;Фактологические бюллетени, посвященные процессу включения в перечень, обновление перечня и типовая форма для представления материалов
Fact sheets on listing, updating the List and standard form for submissionsВ приложении к нему содержится типовая форма сообщений Комитету, которую рекомендуется использовать общественности.
Annexed to the paper was a model form for communications to the Committee that the public would be recommended to use.С этой целью к постановлению приложена типовая форма сообщения о таких операциях.
Attached to the resolution is a model form for that purpose.Нынешняя типовая форма рассматривалась некоторыми Сторонами как ограниченная с точки зрения изучения положения в области осуществления НПД.
The current template was considered by some Parties as limited in terms of investigating the status of implementation of the NAP.Эта типовая форма может быть использована и для подготовки к встрече между запрашивающей страной, Комитетом 1540 и заинтересованными поставщиками помощи.
This template may also be used to prepare for a meeting between a requesting country, the 1540 Committee and interested assistance providers.Ь) было вновь заявлено, что типовая форма отражает решения, которые были приняты Конвенцией в ходе переговорного процесса.
It was reiterated that the template reflects decisions that have been taken by the Convention in the negotiation process.Кроме того, после выражения странами — Сторонами Конвенции своих замечаний и откликов для этой отчетной кампании была введена иная, упрощенная типовая форма отчетности.
Moreover, a different, simplified template was introduced for this reporting exercise, following comments and feedback expressed by country Parties.Было решено, что сразу после утверждения Комитетом государствам — членам ЕЭК будет направлена типовая форма, содержащая вопросник.
It was agreed that a template containing a questionnaire would be sent to ECE member State, once approved by the Committee.Мы твердо верим в то, что это новая типовая форма будет полезной для всего делового сообщества.
We firmly believe that this new model form will be of benefit to the entire business community.Опыт показывает, что данная типовая форма заявки требует пояснений для того, чтобы пользователи могли правильно заполнять все необходимые поля.
Experience showed that the template needed to be clarified to enable applicants to correctly fill in all necessary fields.Примечание секретариата: В настоящем документе содержится обновленная типовая форма, которую следует использовать для представления просьб об обновлении списка разновидностей яблок.
Note by the secretariat: This document contains the updated template to be used for requests of updating the list of varieties for apples.с) руководящие принципы и типовая форма для кратких докладов в соответствии со статьей 7;
(c) Guidelines and template for summary reports in accordance with article 7;Письмо о поддержке ГД (типовая форма)
Country HoD letter of support (Template)Предлагаемая типовая форма для подготовки докладов для среднесрочного обзора
Proposed template for preparing reports for the mid-term reviewПо просьбе Бюро типовая форма отчетности о состоянии осуществления стратегического плана будет распространена среди всех координационных центров и заинтересованных сторон весной 2013 года.
Upon the request of the Bureau, a template regarding the status of implementation of the strategic plan would be distributed to all focal points and stakeholders in spring 2013.Для оказания поддержки текущему сбору информации о положительном опыте в области ОУР данная пересмотренная типовая форма была размещена на веб-сайте ЕЭК ООН ().
To support ongoing collection of good practices in ESD, this revised template has been made available on the UNECE website ().Большинство респондентов предпочли бы, если бы через всемирную сеть была доступна краткая типовая форма отчетности, опирающаяся на уже имеющиеся данные.
Most respondents would prefer a web-based reporting template that would be concise and rely on available data.Было высказано мнение о том, что типовая форма заявки требует пересмотра для разъяснения необходимости предоставления такой информации.
It was felt that the template might need to be revised to clarify which information was requested.Создание форм из моделей | Документация Django
Модель Форма
¶- класс
Модель Форма
¶
Если вы создаете приложение на основе базы данных, скорее всего, у вас будут формы,
карта близко к моделям Django. Например, у вас может быть BlogComment
модель, и вы хотите создать форму, позволяющую людям отправлять комментарии. В этом
В этом случае было бы излишним определять типы полей в вашей форме, потому что
вы уже определили поля в своей модели.
По этой причине Django предоставляет вспомогательный класс, который позволяет вам создать форму
класс из модели Django.
Например:
>>> из django.forms import ModelForm >>> из статьи импорта myapp.models # Создайте класс формы. >>> класс ArticleForm (ModelForm): ... класс Meta: ... model = Статья ... fields = ['pub_date', 'headline', 'content', 'reporter'] # Создание формы для добавления статьи. >>> form = ArticleForm () # Создание формы для изменения существующей статьи.>>> article = Article.objects.get (pk = 1) >>> form = ArticleForm (instance = article)
Типы полей¶
Созданный класс Form
будет иметь поле формы для каждого поля модели.
указывается в порядке, указанном в полях атрибута
.
Каждое поле модели имеет соответствующее поле формы по умолчанию. Например, CharField
в модели отображается как CharField
в форме. Модель ManyToManyField
представлен как MultipleChoiceField
.Здесь
полный список преобразований:
Как и следовало ожидать, поле модели ForeignKey
и ManyToManyField
типы — особые случаи:
-
ForeignKey
представленdjango.forms.ModelChoiceField
, который представляет собойChoiceField
, выбор которого — модельQuerySet
. -
ManyToManyField
представленdjango.forms.ModelMultipleChoiceField
, который являетсяMultipleChoiceField
, выбор которого — модельQuerySet
.
Кроме того, каждое сгенерированное поле формы имеет следующие атрибуты:
- Если в поле модели
blank = True
, то требуетсяЛожь
в поле формы. В противном случае требуется= True
. - Ярлык
поля формы
установлен наverbose_name
модели. поле с заглавной буквы. -
help_text
поля формы устанавливается наhelp_text
модели. поле. - Если в поле модели задано
вариантов выбора
, то виджетполя формы
будет установлено значение. Выберите
, с выбором из поля модели.вариантов
. Варианты выбора обычно включают пустой вариант, который выбрано по умолчанию. Если поле является обязательным, это заставляет пользователя сделайте выбор. Пустой вариант не будет включен, если модель поле имеетпробел = False
и явное значениепо умолчанию
(по умолчанию вместо этого будет изначально выбрано значение
).
Наконец, обратите внимание, что вы можете переопределить поле формы, используемое для данной модели. поле. См. Раздел «Замена полей по умолчанию» ниже.
Полный пример¶
Рассмотрим такой набор моделей:
из моделей импорта django.db из django.forms import ModelForm TITLE_CHOICES = [ ('MR', 'Мистер'), («МИССИС», «Миссис»), ("MS", "Ms."), ] Автор класса (models.Model): name = models.CharField (max_length = 100) title = models.CharField (max_length = 3, choices = TITLE_CHOICES) Birth_date = модели.DateField (blank = True, null = True) def __str __ (сам): вернуть self.name Книга классов (models.Model): name = models.CharField (max_length = 100) авторы = models.ManyToManyField (Автор) класс AuthorForm (ModelForm): класс Мета: model = Автор fields = ['имя', 'титул', 'дата_рождения'] класс BookForm (ModelForm): класс Мета: model = Книга fields = ['имя', 'авторы']
С этими моделями подклассы ModelForm
, указанные выше, будут примерно
эквивалентно этому (единственное отличие состоит в методе save ()
, который
мы обсудим через минуту.):
из форм импорта django класс AuthorForm (forms.Form): name = forms.CharField (max_length = 100) title = forms.CharField ( max_length = 3, widget = forms.Select (choices = TITLE_CHOICES), ) Birth_date = forms.DateField (обязательно = False) класс BookForm (forms.Form): name = forms.CharField (max_length = 100) авторы = forms.ModelMultipleChoiceField (queryset = Author.objects.all ())
Валидация на модели
, форма
¶ Проверка модели ModelForm
:
- Проверка формы
- Проверка экземпляра модели
Как и при проверке нормальной формы, проверка формы модели запускается неявно
при вызове is_valid ()
или доступе к ошибок
атрибута и явно при вызове full_clean ()
, хотя, как правило, вы не будете использовать последний метод в
упражняться.
Проверка модели
( Model.full_clean ()
) запускается из формы
шаг проверки, сразу после вызова метода clean ()
формы.
Предупреждение
Процесс очистки изменяет экземпляр модели, переданный в Конструктор ModelForm
различными способами. Например, любые поля даты на
модели преобразуются в объекты фактической даты. Неудачная проверка может
оставить базовый экземпляр модели в несогласованном состоянии и, следовательно,
не рекомендуется использовать его повторно.
Отмена метода clean () ¶
Вы можете переопределить метод clean ()
в модельной форме, чтобы обеспечить дополнительные
проверка так же, как и в обычной форме.
Экземпляр формы модели, прикрепленный к объекту модели, будет содержать экземпляр
Атрибут, который дает своим методам доступ к этому конкретному экземпляру модели.
Предупреждение
Метод ModelForm.clean ()
устанавливает флаг, который делает модель
этап валидации подтверждает уникальность модели
поля, помеченные как уникальные
, уникальные_ совокупно
или unique_for_date | месяц | год
.
Если вы хотите переопределить метод clean ()
и сохранить его
При проверке необходимо вызвать метод clean ()
родительского класса.
Взаимодействие с проверкой модели¶
В рамках процесса проверки ModelForm
вызовет clean ()
для каждого поля вашей модели, имеющего соответствующее поле в вашей форме.
Если вы исключили какие-либо поля модели, проверка не будет выполняться для этих полей.
поля. См. Документацию по проверке формы
для получения дополнительной информации о том, как работают очистка и проверка полей.
Метод clean () модели
будет вызываться перед проверкой уникальности.
сделал. См. Дополнительные сведения в разделе Проверка объектов.
на крючок модели clean ()
.
Соображения относительно модели
error_messages
¶ Сообщения об ошибках, определенные в поле формы
или на уровне
форма Мета-уровень всегда принимает
приоритет над сообщениями об ошибках, определенными в поле модели
уровень.
Сообщения об ошибках, определенные в полях модели
, используются только тогда, когда ValidationError
возникает на этапе проверки модели, и соответствующие сообщения об ошибках не определены в
уровень формы.
Вы можете переопределить сообщения об ошибках из NON_FIELD_ERRORS
, вызванные моделью
проверка путем добавления ключа NON_FIELD_ERRORS
в словарь error_messages
внутреннего класса ModelForm
Meta
:
из django.core.exceptions import NON_FIELD_ERRORS из django.forms import ModelForm класс ArticleForm (ModelForm): класс Мета: error_messages = { NON_FIELD_ERRORS: { 'unique_toght': "% (field_labels)% (model_name) s не уникальны.", } }
Метод
save ()
¶ Каждая модель ModelForm
также имеет метод save ()
. Этот метод создает и сохраняет
объект базы данных из данных, привязанных к форме. Подкласс ModelForm
может принять существующий экземпляр модели в качестве аргумента ключевого слова instance
; если
это предусмотрено, save ()
обновит этот экземпляр. Если его нет, save ()
создаст новый экземпляр указанной модели:
>>> из myapp.модели импортные статьи >>> из myapp.forms импортировать ArticleForm # Создать экземпляр формы из данных POST. >>> f = ArticleForm (request.POST) # Сохранить новый объект Article из данных формы. >>> new_article = f.save () # Создайте форму для редактирования существующей статьи, но используйте # Данные POST для заполнения формы. >>> a = Article.objects.get (pk = 1) >>> f = ArticleForm (request.POST, instance = a) >>> f.save ()
Обратите внимание, что если форма не была проверена, вызов save ()
сделает это путем проверки форма.ошибки
. Ошибка ValueError
будет вызвана, если данные в форме
не проверяется — то есть, если form.errors
оценивается как True
.
Если необязательное поле не отображается в данных формы, итоговая модель
экземпляр использует поле модели по умолчанию
, если
есть один для этого поля. Это поведение не применяется к полям, которые используют Флажок Вход
, CheckboxSelectMultiple
, или SelectMultiple
(или любой пользовательский виджет, метод value_omarded_from_data ()
всегда возвращает Ложь
), поскольку флажок снят и не выбран <выбрать несколько>
не отображаются в данных при отправке HTML-формы.Используйте настраиваемое поле формы или
виджет, если вы разрабатываете API и хотите использовать резервное поведение по умолчанию для
поле, которое использует один из этих виджетов.
Этот метод save ()
принимает необязательный аргумент ключевого слова commit
, который
принимает либо True
, либо False
. Если вы позвоните по номеру , сохраните ()
с помощью commit = False
, тогда он вернет объект, который еще не был сохранен в
база данных. В этом случае вы должны позвонить save ()
по полученному
экземпляр модели.Это полезно, если вы хотите выполнить индивидуальную обработку на
объект перед его сохранением, или если вы хотите использовать один из специализированных
варианты сохранения модели. фиксация
— это True
по умолчанию.
Другой побочный эффект использования commit = False
виден, когда ваша модель
отношение «многие ко многим» с другой моделью. Если в вашей модели много ко многим
отношение и вы указываете commit = False
при сохранении формы, Django не может
немедленно сохраните данные формы для отношения «многие ко многим».Это потому что
невозможно сохранить данные «многие ко многим» для экземпляра, пока он не
существует в базе данных.
Чтобы обойти эту проблему, каждый раз, когда вы сохраняете форму, используя commit = False
,
Django добавляет метод save_m2m ()
к вашему подклассу ModelForm
. После
вы вручную сохранили экземпляр, созданный формой, вы можете вызвать save_m2m ()
для сохранения данных формы «многие ко многим». Например:
# Создать экземпляр формы с данными POST.>>> f = AuthorForm (request.POST) # Создать, но не сохранять новый экземпляр автора. >>> new_author = f.save (фиксация = False) # Каким-то образом изменить автора. >>> new_author.some_field = 'какое-то_значение' # Сохраняем новый экземпляр. >>> new_author.save () # Теперь сохраните данные "многие ко многим" для формы. >>> f.save_m2m ()
Вызов save_m2m ()
требуется только в том случае, если вы используете save (commit = False)
.
Когда вы используете save ()
в форме, все данные, включая данные «многие ко многим» —
сохраняется без необходимости каких-либо дополнительных вызовов методов.Например:
# Создать экземпляр формы с данными POST. >>> a = Автор () >>> f = AuthorForm (request.POST, instance = a) # Создайте и сохраните новый экземпляр автора. Больше ничего делать не нужно. >>> new_author = f.save ()
Кроме методов save ()
и save_m2m ()
, ModelForm
работает
точно так же, как и любой другой формирует форму
. Например, is_valid () Метод
используется для проверки действительности, метод is_multipart ()
используется, чтобы определить, требует ли форма загрузки файлов из нескольких частей (и
отсюда ли запрос.ФАЙЛЫ
необходимо передать в форму) и т. Д. См.
Привязка загруженных файлов к форме для получения дополнительной информации.
Выбор полей для использования¶
Настоятельно рекомендуется явно указать все поля, которые должны быть
редактируется в форме с использованием атрибута полей
. Невыполнение этого требования может легко
привести к проблемам с безопасностью, когда форма неожиданно позволяет пользователю установить определенные
поля, особенно когда в модель добавляются новые поля. В зависимости от того, как
форма отображается, проблема может даже не отображаться на веб-странице.
Альтернативный подход — автоматическое включение всех полей или удалить только некоторые. Известно, что этот фундаментальный подход гораздо менее безопасен. и привел к серьезным атакам на крупных веб-сайтах (например, GitHub).
Однако есть два ярлыка для случаев, когда вы можете гарантировать эти соображения безопасности к вам не относятся:
Задайте для атрибута
fields
специальное значение'__all__'
, чтобы указать что все поля в модели должны использоваться.Например:из django.forms import ModelForm класс AuthorForm (ModelForm): класс Мета: model = Автор fields = '__all__'
Установите для атрибута
exclude
внутреннего классаMeta
ModelForm
значение список полей, которые нужно исключить из формы.Например:
класс PartialAuthorForm (ModelForm): класс Мета: model = Автор exclude = ['название']
Начиная с модели
Автор
имеет 3 поля:имя
,заголовок
иBirth_date
, в результате появятся поляname
иBirth_date
присутствуют в форме.
Если используется любой из них, порядок отображения полей в форме будет следующим.
порядок полей, определенных в модели, с экземплярами ManyToManyField
появляется последним.
Кроме того, Django применяет следующее правило: если вы установите editable = False
на
поле модели, любая форма , созданная из модели с помощью ModelForm
, не будет
включить это поле.
Примечание
Любые поля, не включенные в форму по вышеуказанной логике
не будет устанавливаться методом save ()
формы.Кроме того, если вы
вручную добавить исключенные поля обратно в форму, они не будут
инициализироваться из экземпляра модели.
Django предотвратит любую попытку сохранить неполную модель, поэтому, если
модель не позволяет отсутствующим полям быть пустыми и делает
не указывать значение по умолчанию для отсутствующих полей, любая попытка save ()
ModelForm
с отсутствующими полями завершится ошибкой. К
чтобы избежать этого сбоя, вы должны создать экземпляр своей модели с начальным
значения для недостающих, но обязательных полей:
author = Автор (title = 'Mr') form = PartialAuthorForm (запрос.POST, instance = author) form.save ()
В качестве альтернативы вы можете использовать save (commit = False)
и установить вручную
любые дополнительные обязательные поля:
форма = PartialAuthorForm (request.POST) author = form.save (commit = False) author.title = 'Мистер' author.save ()
Подробнее об использовании см. В разделе о сохранении форм. сохранить (фиксация = False)
.
Замена полей по умолчанию
Типы полей по умолчанию, как описано в таблице типов полей выше, являются
разумные значения по умолчанию.Если у вас есть DateField
в вашей модели, скорее всего, вы
хотите, чтобы это было представлено как DateField
в вашей форме. Но модель по форме
дает вам возможность изменять поле формы для данной модели.
Чтобы указать настраиваемый виджет для поля, используйте атрибут widgets
внутренний Мета
класс. Это должен быть словарь, отображающий имена полей для виджета.
классы или экземпляры.
Например, если вы хотите CharField
для атрибута name
Автор
будет представлен как вместо значения по умолчанию
, вы можете переопределить виджет поля:
из django.формы импортируют ModelForm, Textarea from myapp.models import Автор класс AuthorForm (ModelForm): класс Мета: model = Автор fields = ('имя', 'титул', 'дата_рождения') widgets = { 'name': Textarea (attrs = {'cols': 80, 'rows': 20}), }
Словарь виджетов
принимает экземпляры любого виджета (например,
Textarea (...)
) или классы (например, Textarea
). Обратите внимание, что виджеты
словарь игнорируется для поля модели с непустым атрибутом choices
.В этом случае вы должны переопределить поле формы, чтобы использовать другой виджет.
Аналогичным образом можно указать метки
, help_texts
и error_messages
атрибуты внутреннего класса Meta
, если вы хотите дополнительно настроить поле.
Например, если вы хотите настроить формулировку всех пользовательских строк для
имя
поле:
из django.utils.translation импортируйте gettext_lazy как _ класс AuthorForm (ModelForm): класс Мета: model = Автор fields = ('имя', 'титул', 'дата_рождения') label = { 'name': _ ('Писатель'), } help_texts = { 'name': _ ('Полезный справочный текст.'), } error_messages = { 'название': { 'max_length': _ ("Имя автора слишком длинное."), }, }
Вы также можете указать field_classes
, чтобы настроить тип полей
создается формой.
Например, если вы хотите использовать MySlugFormField
для ярлыка
поле, вы можете сделать следующее:
из django.forms import ModelForm из статьи импорта myapp.models класс ArticleForm (ModelForm): класс Мета: model = Статья fields = ['pub_date', 'headline', 'content', 'reporter', 'slug'] field_classes = { 'slug': MySlugFormField, }
Наконец, если вам нужен полный контроль над полем, включая его тип,
валидаторы, требуются и т. д.- это можно сделать, декларативно указав
поля, как в обычной Форме
.
Если вы хотите указать валидаторы поля, вы можете сделать это, определив
поле декларативно и установив его валидаторов
параметр:
из django.forms import CharField, ModelForm из статьи импорта myapp.models класс ArticleForm (ModelForm): slug = CharField (валидаторы = [validate_slug]) класс Мета: model = Статья fields = ['pub_date', 'headline', 'content', 'reporter', 'slug']
Примечание
Когда вы явно создаете экземпляр такого поля формы, важно
понять, как связаны ModelForm
и обычная Form
.
ModelForm
— это обычная форма Form
, которая может автоматически генерировать
определенные поля. Поля, которые создаются автоматически, зависят от
содержимое класса Meta
и какие поля уже были
определяется декларативно. По сути, ModelForm
будет только генерировать поля
отсутствуют в форме, или, другими словами, поля, которые не были
определяется декларативно.
Поля, определенные декларативно, остаются как есть, поэтому любые настройки
сделано в Мета
атрибутов, таких как виджетов
, меток
, help_texts
,
или error_messages
игнорируются; они применимы только к полям, которые
генерируется автоматически.
Точно так же декларативно определенные поля не отображают свои атрибуты, такие как
max_length
или требуется
от соответствующей модели. Если вы хотите
поддерживать поведение, указанное в модели, необходимо установить соответствующие
аргументы явно при объявлении поля формы.
Например, если модель Article
выглядит так:
Артикул (модели. Модель): заголовок = models.CharField ( max_length = 200, null = True, blank = True, help_text = 'Обильно каламбуруйте', ) контент = модели.Текстовое поле()
, и вы хотите выполнить некоторую настраиваемую проверку для заголовка
, сохраняя
значения blank
и help_text
, как указано, вы можете определить
СтатьяФорма
как это:
класс ArticleForm (МодельФорма): заголовок = MyFormField ( max_length = 200, required = False, help_text = 'Обильно каламбуруйте', ) класс Мета: model = Статья fields = ['заголовок', 'содержание']
Вы должны убедиться, что тип поля формы может использоваться для установки
содержимое соответствующего поля модели.Когда они несовместимы,
вы получите ValueError
, поскольку неявное преобразование не происходит.
См. Дополнительную информацию в документации по полям формы. о полях и их аргументах.
Включение локализации полей¶
По умолчанию поля в ModelForm
не локализуют свои данные. К
включить локализацию полей, можно использовать localized_fields
атрибут в классе Meta
.
>>> из django.формы импортировать ModelForm >>> from myapp.models import Author >>> класс AuthorForm (ModelForm): ... класс Meta: ... model = Автор ... localized_fields = ('дата_рождения',)
Если для localized_fields
установлено специальное значение '__all__'
, все поля
будет локализован.
Форма наследования¶
Как и в случае с базовыми формами, вы можете расширять и повторно использовать ModelForms
путем наследования
их. Это полезно, если вам нужно объявить дополнительные поля или дополнительные методы в
родительский класс для использования в ряде форм, производных от моделей.Например,
с использованием предыдущей ArticleForm
класс:
>>> класс EnhancedArticleForm (ArticleForm): ... def clean_pub_date (сам): ... ...
Это создает форму, которая ведет себя идентично ArticleForm
, за исключением
некоторая дополнительная проверка и очистка для поля pub_date
.
Вы также можете создать подкласс родительского внутреннего класса Meta
, если хотите изменить
Meta. поля
или Meta.исключить
списков:
>>> класс RestrictedArticleForm (EnhancedArticleForm): ... класс Meta (ArticleForm.Meta): ... exclude = ('тело',)
Это добавляет дополнительный метод из EnhancedArticleForm
и изменяет
оригинал ArticleForm.Meta
для удаления одного поля.
Однако следует отметить несколько моментов.
-
Применяются обычные правила разрешения имен Python. Если у вас несколько баз классы, которые объявляют внутренний класс
Meta
, только первый будет использовал.Это означает, чтоMeta
ребенка, если он существует, в противном случаеМета
первого родителя и т. Д. -
Можно наследовать как
Form
, так иModelForm
одновременно, однако вы должны убедиться, чтоModelForm
появляется первым в MRO. Это потому что эти классы полагаются на разные метаклассы, а класс может иметь только один метакласс. -
Можно декларативно удалить
Поле
, унаследованное от родительского класса установка имениНет
для подкласса.Вы можете использовать этот метод только для отказа от поля, определенного декларативно. родительским классом; это не помешает метаклассу
ModelForm
генерировать поле по умолчанию. Чтобы отказаться от использования полей по умолчанию, см. Выбор полей для использования.
Предоставление начальных значений¶
Как и в обычных формах, можно указать исходные данные для форм с помощью
указание начального параметра
при создании формы. Исходный
значения, предоставленные таким образом, переопределят оба начальных значения из поля формы
и значения из прикрепленного экземпляра модели.Например:
>>> article = Article.objects.get (pk = 1) >>> article.headline 'Мой Заголовок' >>> form = ArticleForm (initial = {'заголовок': 'Начальный заголовок'}, instance = article) >>> form ['заголовок']. value () "Начальный заголовок"Заводская функция модели
Вы можете создавать формы из данной модели, используя автономную функцию
modelform_factory ()
вместо использования класса
определение. Это может быть удобнее, если у вас мало настроек
сделать:
>>> из django.формы импорта modelform_factory >>> из книги импорта myapp.models >>> BookForm = modelform_factory (Книга, поля = ("автор", "название"))
Это также можно использовать для внесения изменений в существующие формы, например, с помощью указание виджетов, которые будут использоваться для данного поля:
>>> из django.forms import Textarea >>> Form = modelform_factory (Книга, форма = BookForm, ... widgets = {"title": Textarea ()})
Поля для включения могут быть указаны с помощью полей
и исключить
аргументы ключевого слова или соответствующие атрибуты во внутренней ModelForm
Мета
класс.См. ModelForm
Выбор полей для использования
документация.
… или включить локализацию для определенных полей:
>>> Form = modelform_factory (Автор, form = AuthorForm, localized_fields = ("Birth_date",))
Наборы моделей
-
класс
моделей.
BaseModelFormSet
¶
Как и обычные наборы форм, Django предоставляет пару
расширенных классов наборов форм, чтобы сделать работу с моделями Django более удобной
удобный.Давайте повторно воспользуемся моделью Author
сверху:
>>> из django.forms import modelformset_factory >>> from myapp.models import Author >>> AuthorFormSet = modelformset_factory (Автор, fields = ('имя', 'заголовок'))
Использование полей
ограничивает набор форм для использования только заданных полей.
В качестве альтернативы вы можете использовать подход «отказа», указав, какие поля следует
исключить:
>>> AuthorFormSet = modelformset_factory (Автор, exclude = ('Birth_date',))
Это создаст набор форм, способный работать с данными, связанными с
с моделью Author
.Он работает так же, как и обычный набор форм:
>>> formset = AuthorFormSet () >>> печать (набор форм)
Примечание
При использовании многотабличного наследования формы
сгенерированный фабрикой набора форм будет содержать поле родительской ссылки (по умолчанию
) вместо поля id
.
Изменение набора запросов¶
По умолчанию, когда вы создаете набор форм из модели, набор форм будет использовать
queryset, который включает все объекты в модели (например,грамм.,
Автор.objects.all ()
). Вы можете переопределить это поведение, используя
набор запросов
аргумент:
>>> formset = AuthorFormSet (queryset = Author.objects.filter (name__startswith = 'O'))
В качестве альтернативы вы можете создать подкласс, который устанавливает self.queryset
в
__init__
:
из django.forms import BaseModelFormSet from myapp.models import Автор класс BaseAuthorFormSet (BaseModelFormSet): def __init __ (self, * args, ** kwargs): супер().__init __ (* аргументы, ** kwargs) self.queryset = Автор.objects.filter (name__startswith = 'O')
Затем передайте свой класс BaseAuthorFormSet
в фабричную функцию:
>>> AuthorFormSet = modelformset_factory ( ... Автор, fields = ('name', 'title'), formset = BaseAuthorFormSet)
Если вы хотите вернуть набор форм, который не включает или ранее существовавших экземпляров модели, вы можете указать пустой QuerySet:
>>> AuthorFormSet (queryset = Author.objects.none ())
Изменение формы¶
По умолчанию, когда вы используете modelformset_factory
, модельная форма будет
можно создать с помощью modelform_factory ()
.
Часто бывает полезно указать настраиваемую форму модели. Например,
вы можете создать настраиваемую форму модели с настраиваемой проверкой:
класс AuthorForm (forms.ModelForm): класс Мета: model = Автор fields = ('имя', 'заголовок') def clean_name (сам): # настраиваемая проверка для поля имени ...
Затем передайте форму модели в функцию factory:
AuthorFormSet = modelformset_factory (Автор, форма = AuthorForm)
Не всегда необходимо определять пользовательскую форму модели. В
modelformset_factory
функция имеет несколько аргументов, которые
передано на modelform_factory
, которые описаны ниже.
Включение локализации для полей с
localized_fields
¶
С помощью параметра localized_fields
можно включить локализацию для
поля в форме.
>>> AuthorFormSet = modelformset_factory ( ... Автор, fields = ('name', 'title', 'Birth_date'), ... localized_fields = ('дата_рождения',))
Если для localized_fields
установлено специальное значение '__all__'
, все поля
будет локализован.
Предоставление начальных значений¶
Как и в случае с обычными наборами форм, можно указать начальные данные для форм в наборе форм, указав начальное
параметр при создании экземпляра класса набора форм модели, возвращаемого
modelformset_factory ()
.Однако с моделью
наборов форм, начальные значения применяются только к дополнительным формам, те, которые не
прикреплен к существующему экземпляру модели. Если длина исходная
превышает
количество лишних форм, лишние исходные данные игнорируются. Если лишний
формы с исходными данными не изменяются пользователем, не проходят валидацию или
сохранено.
Сохранение объектов в наборе форм¶
Как и ModelForm
, вы можете сохранить данные как объект модели. Закончено
с помощью метода save ()
набора форм:
# Создать экземпляр набора форм с данными POST.>>> formset = AuthorFormSet (request.POST) # Предполагая, что все в порядке, сохраните данные. >>> экземпляры = formset.save ()
Метод save ()
возвращает экземпляры, которые были сохранены в
база данных. Если данные данного экземпляра не изменились в связанных данных,
экземпляр не будет сохранен в базе данных и не будет включен в возврат
значение ( экземпляра
, в приведенном выше примере).
Когда поля отсутствуют в форме (например, потому что они были
исключено), эти поля не будут установлены методом save ()
.Ты можешь найти
подробнее об этом ограничении, которое также действует для обычных
ModelForms
, в Выбор полей для использования.
Pass commit = False
для возврата несохраненных экземпляров модели:
# в базу не сохранять >>> instance = formset.save (commit = False) >>> например, в примерах: ... # делаем что-нибудь с экземпляром ... instance.save ()
Это дает вам возможность прикреплять данные к экземплярам перед их сохранением.
в базу данных.Если ваш набор форм содержит ManyToManyField
, вы также
необходимо вызвать formset.save_m2m ()
, чтобы гарантировать отношения «многие ко многим»
сохраняются правильно.
После вызова save ()
ваш модельный набор форм будет иметь три новых атрибута
содержащий изменения набора форм:
-
моделей.
измененных_объекта
¶
-
моделей.
удаленных_объекта
¶
-
модели.BaseModelFormSet.
новые_объекты
¶
Ограничение количества редактируемых объектов¶
Как и в обычных наборах форм, вы можете использовать параметры max_num
и extra
до modelformset_factory ()
, чтобы ограничить количество
отображаются дополнительные формы.
max_num
не запрещает отображение существующих объектов:
>>> Author.objects.order_by ('имя'), <Автор: Поль Верлен>, <Автор: Уолт Уитмен>]> >>> AuthorFormSet = modelformset_factory (Автор, fields = ('name',), max_num = 1) >>> formset = AuthorFormSet (queryset = Автор.objects.order_by ('имя')) >>> [x.name для x в formset.get_queryset ()] ["Шарль Бодлер", "Поль Верлен", "Уолт Уитмен"]
Кроме того, extra = 0
не препятствует созданию новых экземпляров модели, как вы можете
добавить дополнительные формы с помощью JavaScript
или отправьте дополнительные данные POST. В наборах форм еще нет функций для режима «только редактирование», предотвращающего создание новых экземпляров.
Если значение max_num
больше, чем количество существующих связанных
объектов, в набор форм будет добавлено до дополнительных
дополнительных пустых форм,
пока общее количество форм не превышает max_num
:
>>> AuthorFormSet = modelformset_factory (Автор, fields = ('name',), max_num = 4, extra = 2) >>> formset = AuthorFormSet (queryset = Автор.objects.order_by ('имя')) >>> для формы в наборе форм: ... печать (form.as_table ())
A max_num
значение None
(по умолчанию) устанавливает верхний предел для числа
отображаемых форм (1000).На практике это эквивалентно неограниченному количеству.
Использование модельного набора форм на виде¶
Наборы форм модели очень похожи на наборы форм. Допустим, мы хотим представить
набор форм для редактирования Автор
экземпляров модели:
из django.forms импортировать modelformset_factory из django.shortcuts import render from myapp.models import Автор def manage_authors (запрос): AuthorFormSet = modelformset_factory (Автор, fields = ('имя', 'заголовок')) если request.method == 'POST': formset = AuthorFormSet (запрос.POST, request.FILES) если formset.is_valid (): formset.save () # сделай что-нибудь. еще: formset = AuthorFormSet () вернуть рендеринг (запрос, 'manage_authors.html', {'formset': formset})
Как видите, логика представления модельного набора форм не сильно отличается
чем у «нормального» набора форм. Единственная разница в том, что мы называем
formset.save ()
для сохранения данных в базе данных. (Это было описано
выше в разделе Сохранение объектов в наборе форм.)
Замена
clean ()
на ModelFormSet
¶
Как и в случае с ModelForms
, по умолчанию метод clean ()
ModelFormSet
проверит, что ни один из элементов в наборе форм не нарушает
уникальные ограничения вашей модели ( unique
, unique_to together
или
unique_for_date | месяц | год
). Если вы хотите переопределить метод clean ()
на ModelFormSet
и поддерживать эту проверку, вы должны вызвать родительский
класс чистый метод
:
из django.формы импортируют BaseModelFormSet класс MyModelFormSet (BaseModelFormSet): def clean (self): супер (). чистый () # пример настраиваемой проверки в формах в наборе форм для формы в self.forms: # проверка вашего пользовательского набора форм ...
Также обратите внимание, что к тому времени, когда вы дойдете до этого шага, отдельные экземпляры модели
уже созданы для каждой Формы
. Изменение значения в
form.cleaned_data
недостаточно, чтобы повлиять на сохраненное значение.Если хочешь
чтобы изменить значение в ModelFormSet.clean ()
, вы должны изменить
форма. Экземпляр
:
из django.forms import BaseModelFormSet класс MyModelFormSet (BaseModelFormSet): def clean (self): супер (). чистый () для формы в self.forms: name = form.cleaned_data ['имя']. upper () form.cleaned_data ['имя'] = имя # обновить значение экземпляра. form.instance.name = имя
Использование настраиваемого набора запросов¶
Как было сказано ранее, вы можете переопределить набор запросов по умолчанию, используемый моделью. набор форм:
из django.формы импорта modelformset_factory из django.shortcuts import render from myapp.models import Автор def manage_authors (запрос): AuthorFormSet = modelformset_factory (Автор, fields = ('имя', 'заголовок')) если request.method == "POST": formset = AuthorFormSet ( request.POST, request.FILES, queryset = Author.objects.filter (name__startswith = 'O'), ) если formset.is_valid (): formset.save () # Сделай что-нибудь. еще: formset = AuthorFormSet (queryset = Автор.objects.filter (name__startswith = 'O')) вернуть рендеринг (запрос, 'manage_authors.html', {'formset': formset})
Обратите внимание, что мы передаем аргумент queryset
как в POST
, так и в GET
случаи в этом примере.
Использование набора форм в шаблоне¶
Есть три способа визуализировать набор форм в шаблоне Django.
Во-первых, вы можете позволить набору форм делать большую часть работы:
Во-вторых, вы можете визуализировать набор форм вручную, но пусть форма будет обрабатывать сам:
Когда вы вручную визуализируете формы, обязательно визуализируйте управление форма, как показано выше. См. Документацию по форме управления.
В-третьих, вы можете визуализировать каждое поле вручную:
Если вы выберете этот третий метод и не перебираете поля с
цикл {% for%}
, вам необходимо отобразить поле первичного ключа.Например,
если вы визуализировали поля модели name
и age
:
Обратите внимание, как нам нужно явно отобразить {{form.id}}
. Это гарантирует, что
модельный набор форм в случае POST
будет работать правильно.(Этот пример
предполагает первичный ключ с именем id
. Если вы явно определили свой
первичный ключ, который не называется id
, убедитесь, что он отображается.)
Наборы встроенных форм¶
-
класс
моделей.
BaseInlineFormSet
¶
Встроенные наборы форм — это небольшой уровень абстракции над наборами форм модели. Эти упростить случай работы со связанными объектами через внешний ключ. Предполагать у вас есть эти две модели:
из django.модели импорта БД Автор класса (models.Model): name = models.CharField (max_length = 100) Книга классов (models.Model): author = models.ForeignKey (Автор, on_delete = models.CASCADE) title = models.CharField (max_length = 100)
Если вы хотите создать набор форм, позволяющий редактировать книги, принадлежащие конкретного автора, вы могли бы сделать это:
>>> из django.forms import inlineformset_factory >>> BookFormSet = inlineformset_factory (Автор, Книга, поля = ('название',)) >>> author = Автор.objects.get (name = 'Майк Ройко') >>> formset = BookFormSet (экземпляр = автор)
Префикс BookFormSet
— 'book_set'
( <название модели> _set
). Если Book
’s ForeignKey
— Author
имеет
related_name
, который используется вместо этого.
Переопределение методов в
InlineFormSet
¶
При переопределении методов в InlineFormSet
вы должны создать подкласс
BaseInlineFormSet
, а не
Набор базовых моделей
.
Например, если вы хотите переопределить clean ()
:
из django.forms import BaseInlineFormSet класс CustomInlineFormSet (BaseInlineFormSet): def clean (self): супер (). чистый () # пример настраиваемой проверки в формах в наборе форм для формы в self.forms: # проверка вашего пользовательского набора форм ...
См. Также Переопределение clean () в ModelFormSet.
Затем, когда вы создаете свой встроенный набор форм, передайте необязательный аргумент
набор форм
:
>>> из django.формы импортировать inlineformset_factory >>> BookFormSet = inlineformset_factory (Автор, Книга, fields = ('название',), ... formset = CustomInlineFormSet) >>> author = Author.objects.get (name = 'Майк Ройко') >>> formset = BookFormSet (экземпляр = автор)
Более одного внешнего ключа для одной модели¶
Если ваша модель содержит более одного внешнего ключа для одной и той же модели, вы
необходимо устранить неоднозначность вручную, используя fk_name
. Например, рассмотрим
следующая модель:
класс Дружба (мод.Модель): from_friend = models.ForeignKey ( Друг, on_delete = models.CASCADE, related_name = 'from_friends', ) to_friend = models.ForeignKey ( Друг, on_delete = models.CASCADE, related_name = 'друзья', ) length_in_months = models.IntegerField ()
Чтобы решить эту проблему, вы можете использовать fk_name
для
inlineformset_factory ()
:
>>> FriendshipFormSet = inlineformset_factory (Друг, Дружба, fk_name = 'from_friend', ... fields = ('to_friend', 'length_in_months'))
Использование встроенного набора форм в представлении¶
Вы можете захотеть предоставить представление, которое позволяет пользователю редактировать связанные объекты модели. Вот как это сделать:
def manage_books (запрос, author_id): author = Author.objects.get (pk = author_id) BookInlineFormSet = inlineformset_factory (Автор, Книга, поля = ('название',)) если request.method == "POST": formset = BookInlineFormSet (request.POST, request.ФАЙЛЫ, экземпляр = автор) если formset.is_valid (): formset.save () # Сделай что-нибудь. Обычно должен заканчиваться перенаправлением. Например: вернуть HttpResponseRedirect (author.get_absolute_url ()) еще: formset = BookInlineFormSet (экземпляр = автор) вернуть рендеринг (запрос, 'manage_books.html', {'formset': formset})
Обратите внимание, как мы передаем instance
в случаях POST
и GET
.
Django ModelForm — Создание формы из моделей
Django ModelForm — это класс, который используется для прямого преобразования модели в форму Django.Если вы создаете приложение на основе базы данных, скорее всего, у вас будут формы, которые близко соответствуют моделям Django. Например, модель и форма регистрации пользователя будут иметь одинаковое качество и количество полей модели и полей формы. Поэтому вместо создания избыточного кода, чтобы сначала создать форму, а затем сопоставить ее с моделью в представлении, мы можем напрямую использовать ModelForm. Он принимает в качестве аргумента имя модели и преобразует его в форму Django. Не только это, ModelForm предлагает множество методов и функций, которые автоматизируют весь процесс и помогают устранить избыточность кода.
Как преобразовать модель в форму Django?
Чтобы объяснить работу проекта, мы будем использовать проект geeksforgeeks , создать модель и сопоставить ее с формами Django.
Обратитесь к следующим статьям, чтобы узнать, как создать проект и приложение в Django.
Теперь, когда у нас есть готовый проект, создайте модель в geeks / models.py
,
класс |
Теперь выполните следующие команды для создания модели:
Python управляют.Py makemigrations Python manage.py migrate
Мы можем проверить, что модель была успешно создана на http://127.0.0.1:8000/admin/geeks/geeksmodel/add/,
Чтобы создать форму непосредственно для этой модели, погрузитесь в гиков / форм. py
и введите следующий код:
|
Эта форма принимает два аргумента поля или исключить .
Наконец, чтобы завершить нашу структуру MVT, создайте представление, которое будет отображать форму и напрямую сохранять ее в базе данных.В geeks / views.py,
|
Все настроено. Теперь посетите http://127.0.0.1:8000/,
. Теперь вы можете видеть, что каждое поле модели отображается в поле формы и отображается соответственно. Сопоставления полей обсуждаются позже в этой статье. Итак, теперь давайте попробуем ввести данные в форму и проверить, сохраняются ли они в базе данных.
Нажмите «Отправить» и бинго, форма автоматически сохраняется в базе данных. Мы можем проверить это на http: // локальный: 8000 / admin / geeks / geeksmodel /.
Типы полей
Созданный класс Form будет иметь поле формы для каждого указанного поля модели в порядке, указанном в атрибуте fields. Каждое поле модели имеет соответствующее поле формы по умолчанию. Например, CharField в модели представлен в форме как CharField. Модель ManyToManyField представлена как MultipleChoiceField. Вот полный список преобразований:
Поле модели | Поле формы | |
---|---|---|
AutoField | Не представлено в форме | |
BigAutoField | Не представлено в форме 3856 | IntegerField с min_value, установленным на -72036854775808, и max_value, установленным на |
BinaryField | CharField, если editable установлено значение True в поле модели, в противном случае не представлено в форме. | |
BooleanField | BooleanField или NullBooleanField, если null = True. | |
CharField | CharField с max_length, установленным на max_length поля модели, и empty_value, установленным на None, если null = True. | |
DateField | DateField | |
DateTimeField | DateTimeField | |
DecimalField | DecimalField | |
DurationField | DurationField | |
EmailField | EmailField | |
FileField | FileField | |
FilePathField | FilePathField | |
FloatField | FloatField | |
ForeignKey | ModelChoiceField | |
ImageField | ImageField | |
IntegerField | IntegerField | |
IPAddressField | IPAddressField | |
GenericIPAddressField | GenericIPAddressField | |
ManyToManyField | ModelMultipleChoiceField | |
NullBooleanField | 9113 9 NullBooleanField||
PositiveIntegerField | IntegerField | |
PositiveSmallIntegerField | IntegerField | |
SlugField | SlugField | |
SmallAutoField | Не представлена в виде | |
TextField | CharField с виджета = форм .Textarea | |
TimeField | TimeField | |
URLField | URLField |
Внимание компьютерщик! Укрепите свои основы с помощью курса Python Programming Foundation и изучите основы.
Для начала подготовьтесь к собеседованию. Расширьте свои концепции структур данных с помощью курса Python DS . И чтобы начать свое путешествие по машинному обучению, присоединяйтесь к Машинное обучение - курс базового уровня
Проголосуйте за уровень сложности
Текущая сложность: БазовыйЛегкий Обычный Середина Жесткий Expert
Django ModelForms - JournalDev
В этом руководстве мы обсудим и реализуем ModelForms в нашем веб-приложении Django.Ознакомьтесь с моделями Django и Django Forms, прежде чем продолжить.
Django ModelForms
Вместо дублирования отдельных полей для Django Forms мы можем сопоставить их с конкретной моделью. Это называется ModelForms.
ModelForm - это класс, который можно импортировать с помощью:
из django.forms import ModelForm
Ниже приведены преимущества использования ModelForms:
- ModelForm полезен, когда мы хотим создавать формы из полей базы данных.
- Мы можем добавить наши собственные средства проверки валидации в поля модели базы данных.
- Мы можем включать и исключать поля из модели по нашему выбору.
- Простое и быстрое сохранение данных формы в базе данных.
ModelForm vs Form
ModelForm получает определения полей из указанного класса модели. Он также имеет вспомогательные методы для сохранения форм в базе данных. Эти функции отсутствуют в Формах .
save ()
Метод save вызывается в экземпляре Django ModelForm для сохранения данных в базе данных (SQLite3).
Вызов save запустит проверку. ValueError
будет выдано, если данные в форме не прошли проверку.
save ()
метод также принимает необязательный аргумент фиксации. Установка commit
на false
не сохранит данные в базе данных.
Создание класса ModelForm
Чтобы создать класс ModelForm, нам нужно добавить внутри него класс Meta. Внутри класса Meta мы создаем экземпляр класса Django Model.
Мы должны включить / исключить поля, которые мы хотим использовать в нашей модели.Чтобы включить полей
, мы устанавливаем их в массив Python.
Если вы хотите включить все поля, установите fields = '__all__'
.
По исключить
полей, установить их внутри соответствующего массива.
Пример нашего класса Model и класса ModelForm приведен ниже:
из моделей импорта django.db
из django.forms import ModelForm
класс SampleModel (models.Model):
title = models.CharField (max_length = 100)
описание = модели.CharField (max_length = 255)
def __str __ (сам):
вернуть self.title
класс SampleModelForm (ModelForm):
класс Мета:
model = SampleModel
fields = ['title']
В приведенном выше коде наша SampleModelForm опускает описание поля.
Отображение ModelForm в нашем веб-приложении Django очень похоже на то, как мы это делали в учебнике по Django Forms.
Чтобы сохранить ModelForm в базе данных, мы делаем:
data = SampleModel (title = 'Я')
form = SampleModelForm (запрос.POST, instance = data)
form.save ()
save (commit = False)
обычно используется, когда мы хотим сохранить измененную версию данных без сохранения. Обычно для тестирования.
Для этого мы можем:
form = SampleModelForm (request.POST)
модель = form.save (фиксация = ложь)
model.title = 'Тестирование анупама'
model.save ()
Чтобы использовать фиксацию False, мы должны включить следующий оператор импорта. из django.forms import modelformset_factory
В следующем разделе мы создадим простое веб-приложение Django ModelForms.
Структура проекта
Примечание : display0.html содержит резервную копию display.html.
Чтобы настроить указанный выше проект, выполните в терминале одну за другой следующий набор команд.
mkdir DjangoModelForm
cd DjangoModelForm
virtualenv -p / usr / local / bin / python3 env
исходный env / bin / активировать
pip3 установить django
django-admin startproject ModelFormProject
компакт-диск ModelFormProject
сервер запуска python3 manage.py
django-admin startapp detailsapp
cd detailsapp
mkdir шаблоны
cd шаблоны
коснитесь подробностей пользователя.html
сенсорный дисплей.html
CD ..
коснитесь urls.py
touch forms.py
Имя нашего приложения Django - detailsapp
. Добавьте его в список settings.py INSTALLED_APPS
.
userdetails.html - это первая страница нашего приложения.
Код
Код для файла urls.py
внутри папки detailsapp:
из пути импорта django.urls
от администратора импорта django.contrib
из подробностейприложение импорта представлений как подробностейapp_views
urlpatterns = [
путь ('userdetails /', detailsapp_views.userDetails),
путь ('display /', detailsapp_views.userDetails),
путь ('', admin.site.urls),
]
Код для файла urls.py
внутри папки ModelFormProject:
от администратора импорта django.contrib
из пути импорта django.urls, включить
urlpatterns = [
путь ('admin /', admin.site.urls),
путь ('', include ('detailsapp.urls'))
]
models.py
из моделей импорта django.db
класс UserDetails (models.Модель):
title = models.CharField (max_length = 100)
пол = models.CharField (max_length = 255)
примечания = models.CharField (max_length = 255)
def __str __ (сам):
вернуть self.title
forms.py
из django.forms import ModelForm
из подробностейapp.models импортировать UserDetails
класс UserModelForm (ModelForm):
класс Мета:
model = UserDetails
fields = ['название', 'примечания']
views.py
из джанго.ярлыки импорт рендеринга
из моделей импорта django.db
из подробностейapp.models импортировать UserDetails
из загрузчика импорта django.template
из django.http import HttpResponse
из django.forms импортировать модельformset_factory
# Создайте здесь свои просмотры.
из .forms import UserModelForm
def userDetails (запрос):
если request.method == 'POST':
form = UserModelForm (request.POST)
если form.is_valid ():
u = form.save ()
users = UserDetails.objects.all ()
вернуть render (запрос, 'display.html ', {' users ': users})
еще:
form_class = UserModelForm
return render (request, 'userdetails.html', {
'форма': класс_форм,
})
Когда форма пуста, выполняется инструкция else, которая используется для создания формы в файле userdetails.html:
Учебник по формам Django
Учебник по Django Forms
users = UserDetails.objects.all ()
используется для извлечения всех записей из базы данных и передачи их в файл display.html
:
Учебное пособие по ModelForm
Вся информация о пользователе
<таблица>
{% для элемента в пользователях%}
Заголовок: {{item.название}}
Пол: {{item.gender | по умолчанию: "NA"}}
Примечания: {{item.notes}}
{% endfor%}
Поскольку поле пола исключено, мы установили для него значение по умолчанию с помощью шаблонов Django.
Чтобы запустить приложение на вашем локальном хосте, мы должны сохранить модели в базе данных
python3 управляют.Py makemigrations
python3 manage.py мигрировать
сервер запуска python3 manage.py
Результат работы приложения приведен ниже:
Чтобы очистить базу данных, выполните следующую команду:
python3 manage.py flush
На этом мы подошли к концу данного руководства. В следующем руководстве мы расскажем о дополнительных пользовательских вспомогательных функциях и добавим собственные проверки.
В исходный код ниже мы добавили фрагмент кода для использования save (commit = False).дополнительный / ', views.complementary)
]
Модель:
# - * - кодировка: utf-8 - * -
from __future__ импортировать unicode_literals
из django.contrib.auth.models импортировать пользователя
из моделей импорта django.db
# Создайте свои модели здесь.
класс UserProfile (models.Model):
user_p = models.OneToOneField (Пользователь, related_name = 'userprofile',
primary_key = True)
age = models.CharField (max_length = 3, blank = True)
shortbio = models.CharField (max_length = 400, blank = True)
Просмотры:
# - * - кодировка: utf-8 - * -
from __future__ импортировать unicode_literals
из джанго.ярлыки перенаправление импорта
из django.shortcuts import render
из app.forms импортировать UserEditForm, ProfileEditForm
из app.models импортировать UserProfile
# Создайте здесь свои просмотры.
def дополнительный (запрос):
profile = UserProfile.objects.get (user_p = 1)
user_form = UserEditForm (экземпляр = request.user)
profile_form = ProfileEditForm (экземпляр = request.user)
если request.method == 'POST':
user_form = UserEditForm (instance = request.user,
data = request.POST)
profile_form = ProfileEditForm (экземпляр = запрос.user.usuario,
data = request.POST,
files = request.FILES)
если user_form.is_valid () и profile_form.is_valid ():
user_form.save ()
profile_form.save ()
возврат перенаправления ('redirect_url')
dic = {'profile': профиль,
'user_form': user_form,
'profile_form': profile_form}
возврат рендера (запрос, 'template.html', dic)
Формы:
# - * - кодировка: utf-8 - * -
из форм импорта django
из джанго.[a-zA-ZÀ-Ÿ _] + ([a-zA-ZÀ-Ÿ _] +) * $ ',
message = 'Нецифровые',
code = 'invalid_name')]
first_name = forms.CharField (
label = 'Имя *',
валидаторы = name_val,
widget = forms.TextInput (attrs = {'placeholder': 'Name:'})
)
last_name = forms.CharField (
label = 'Фамилия *',
валидаторы = name_val,
widget = forms.TextInput (attrs = {'placeholder': 'Last Name:'})
)
класс Мета:
model = Пользователь
fields = ('first_name', 'last_name', 'email')
класс ProfileEditForm (forms.ModelForm):
класс Мета:
model = UserProfile
exclude = 'id',
Template.html:
Заголовок
{{profile.shortbio}}
python - как добавить другую форму модели в modelformset_factory
Относительно этих моделей:
класс Проекты (модели.Модель):
projectDescription = models.CharField (max_length = 50, blank = True, null = True,)
status = models.IntegerField (choices = Status_CHOICES, по умолчанию = 4)
projectOwner = models.ForeignKey (staff, on_delete = models.CASCADE, blank = True, null = True,)
Обновления класса (models.Model):
project = models.ForeignKey (Проекты, on_delete = models.CASCADE)
update = models.CharField (max_length = 50, blank = True, null = True,)
updateDate = models.DateTimeField (по умолчанию = timezone.now, editable = False)
addedBy = models.CharField (max_length = 35, blank = True,)
Я хочу создать представление, которое отображает формы для всех текущих проектов . Это легко сделать с помощью модели modelformset_factory
. Но как я могу добавить дополнительную форму к каждому из этих экземпляров формы проекта, чтобы можно было сделать Обновление для проекта (внешний ключ)?
В идеале пользователь вносит изменения в различные проекты, добавляет обновление в один или несколько проектов, а затем отправляет форму для сохранения всех изменений.То, что у меня ниже, кажется очень близким, но оно сохраняет обновление для каждого проекта со значением того, что я ввел в последнюю форму. Видимо, потому, что форма не уникальна. Я пошел по пути использования префиксов, которые, похоже, тоже никуда меня не привели. помощь!
форма обновления
класс updateForm (ModelForm):
def __init __ (self, * args, ** kwargs):
super (updateForm, self) .__ init __ (* args, ** kwargs)
класс Мета:
model = Обновления
fields = ('обновить',)
вид:
def MDSprojects (запрос):
projects = Проекты.objects.filter (dept = 'Вспомогательные технологии')
projectFormset = modelformset_factory (Проекты, форма = EditProjectForm, extra = 0)
если request.method == 'POST':
formsetA = projectFormset (request.POST, request.FILES)
если formsetA.is_valid ():
для f в formsetA:
formA = f.save (фиксация = ложь)
id = formA.id
formA.save ()
formsetB = updateForm (request.POST, request.FILES)
если formsetB.is_valid ():
formB = formsetB.сохранить (фиксация = ложь)
проект = Projects.objects.get (id = id)
formB.project = проект
formB.save ()
еще:
печать (formsetB.errors)
возвратное перенаправление ('MDS_Projects')
еще:
печать (formsetA.errors)
еще:
formsetA = projectFormset (набор запросов = проекты)
formsetB = updateForm ()
возврат рендеринга (запрос, 'MDSprojectsB.html', {'formset': formsetA, 'formsetB': formsetB,})
Шаблон:
РЕДАКТИРОВАТЬ:
Возможно, еще один способ объяснить мой вопрос:
Если бы у меня были такие же модели, как указано выше:
класс Проекты (модели.Модель):
projectDescription = models.CharField (max_length = 50, blank = True, null = True,)
status = models.IntegerField (choices = Status_CHOICES, по умолчанию = 4)
projectOwner = models.ForeignKey (staff, on_delete = models.CASCADE, blank = True, null = True,)
Обновления класса (models.Model):
project = models.ForeignKey (Проекты, on_delete = models.CASCADE)
update = models.CharField (max_length = 50, blank = True, null = True,)
updateDate = models.DateTimeField (по умолчанию = timezone.now, editable = False)
addedBy = models.CharField (max_length = 35, blank = True,)
Я хочу иметь представление, которое отображает все текущие проекты как отдельные формы, чтобы пользователь мог вносить изменения в модель проекта в одном представлении. Кроме того, я хочу, чтобы пользователь также мог добавлять обновления в каждый проект.
Так, например, если бы у меня было 3 проекта, я бы ожидал увидеть на странице 3 формы. Каждая форма будет содержать поля для изменения этого проекта (так что эти поля формы будут предварительно заполнены текущими значениями).Затем, наконец (часть, на которой я застрял), будет дополнительное пустое поле для добавления обновления в проект.
Django Model Forms - Реализация модельных форм в Django
В этой статье мы узнаем о модельных формах Django и о том, как связать их с концепцией моделей.
Предварительные требования для модельных форм Django
Перед тем, как погрузиться в модельные формы, мы должны познакомиться с формами Django и их использованием. Так что, если вы новичок в этом, ознакомьтесь с нашей статьей о формах Django, прежде чем двигаться дальше.
Если вы уже знакомы с Django Forms, тогда приступим!
Почему именно бланки?
Формы имеют смысл только тогда, когда мы сохраняем записи форм, отправленные пользователями. Теперь для их хранения нам потребуется некоторая база данных. Здесь на сцену выходят модельные формы.
Django Model Forms предоставляет способ связать данные , представленные клиентом через форму , с моделью данных , созданной для хранения записи.
Используя ModelForm, мы можем эффективно выполнить указанную выше задачу без написания большого количества кода.
Практическое руководство с модельными формами Django
В этом разделе мы научимся кодировать все части, необходимые для создания модельных форм.
1. Кодирование модели в models.py
В models.py создайте модель FormModel и добавьте в нее следующие поля.
класс FormModel (models.Model): name = models.CharField (max_length = 80) age = models.IntegerField () адрес = models.TextField () класс Мета: заказ = ['имя'] def __str __ (сам): return f "Форма от {self.название}"
Здесь мы используем текстовое поле , , так как адрес может быть достаточно длинным. Обязательно ознакомьтесь со статьей Django Models, чтобы лучше понять модели.
После добавления формы модели запустите миграции, как показано ниже, чтобы создать таблицу БД.
python manage.py мигрировать python manage.py makemigrations
2. Кодирование модельной формы в forms.py
Теперь в forms.py создайте форму, как показано ниже:
Импортируйте FormModel из.модели
из .models import FormModel
Затем добавьте код для формы .
Форма класса (forms.ModelForm): класс Мета: model = FormModel fields = ('имя', 'возраст', 'адрес',)
- Class Meta связывает форму , указанную выше, с моделью , которую мы создали для хранения данных формы.
- Укажите поля модели, которые будут отображаться пользователю в форме.
3. Кодирование FormView в представлениях.py
В Views.py добавьте следующий код для FormView.
def FormView (запрос): если request.method == 'POST': form = Форма (request.POST) если form.is_valid (): form.save () return HttpResponse ('Ваш отзыв был принят') еще: form = Форма () context = { 'form': форма, } возврат рендеринга (запрос, 'app_name / form.html <путь к шаблону>', контекст)
Если форма действительна, форма .save () сохраняет форму непосредственно в БД.
С Model Form обо всем позаботится Django. Все записи формы будут автоматически сохранены в связанной БД FormModel.
4. Кодирование файла шаблона формы.
Теперь осталось только создать шаблон формы для отображения формы пользователю.
В папке с именами шаблонов создаст файл шаблона form.py .
Вот и все, наш HTML-файл готов! Теперь нам просто нужно создать новый путь к FormView в urls.py
путь ('форма / модель', FormView, name = 'FormView'),
Вот и все, ребята !! Часть кода закончена, теперь давайте запустим сервер.
Реализация типовых форм
Запустите сервер с терминала / cmd .
ФормаЗаполните поля и нажмите «Отправить».
Отправка формыДавайте теперь проверим, сохранена ли форма. Зайдите в админку.
Форма МодельВау !! Все, запись сохранена. Посмотрите, насколько просто реализовать Django Model Forms.
Вывод
Вот и все, кодеры! Это все о формах модели Django и о том, как вы можете реализовать их с помощью моделей Django.
Ознакомьтесь с руководством по Django Forms, чтобы лучше понять Forms. Увидимся в следующей статье! Продолжай практиковаться!
Django - Учебное пособие по ModelForm | Самули Натри.Разработчик программного обеспечения.
Как создавать формы с помощью класса ModelForm.
Введение
В этом руководстве показано, как использовать представления на основе функций для создания, редактирования и удаления объектов.
Примечание : Общие представления редактирования на основе классов Django (например, CreateView) предлагают более абстрактное (и более простое) решение.
Краткое руководство
блог / forms.py
Создайте файл с именем forms.py
в каталоге приложения blog и добавьте в него следующие строки:
из django.формы импортировать ModelForm
из .models import Post
класс PostForm (ModelForm):
класс Мета:
model = Опубликовать
fields = ['title']
класс PostDeleteForm (ModelForm):
класс Мета:
model = Опубликовать
fields = []
mysite / urls.py
Отредактируйте основной файл urls.py
и добавьте в него следующие строки:
от администратора импорта django.contrib
из пути импорта django.urls
from blog.views import post_create, post_edit, post_delete
urlpatterns = [
путь ('blog / create /', post_create, name = 'post_create'),
путь ('blog / edit / /', post_edit, name = 'post_edit'),
путь ('blog / delete / /', post_delete, name = 'post_delete'),
путь ('admin /', admin.site.urls),
]
блог / views.py
Отредактируйте файл views.py
и добавьте в него эту функцию:
из django.shortcuts import get_object_or_404, redirect, render
из .forms импортировать PostForm, PostDeleteForm
from blog.models import Post
def post_create (запрос):
если request.method == 'POST':
form = PostForm (request.POST)
если form.is_valid ():
form.save ()
возврат перенаправления ('post_create')
еще:
form = PostForm ()
вернуть рендер (запрос,
'blog / post_create.html ',
{
'form': форма
})
def post_edit (запрос, pk = None):
post = get_object_or_404 (Сообщение, pk = pk)
если request.method == "POST":
form = PostForm (request.POST,
instance = post)
если form.is_valid ():
form.save ()
возврат перенаправления ('post_create')
еще:
form = PostForm (экземпляр = сообщение)
вернуть рендер (запрос,
'blog / post_edit.html',
{
'form': форма,
'post': сообщение
})
def post_delete (запрос, pk = None):
post = get_object_or_404 (Сообщение, pk = pk)
если запрос.method == "POST":
form = PostDeleteForm (request.POST,
instance = post)
если form.is_valid ():
post.delete ()
возврат перенаправления ('post_create')
еще:
form = PostDeleteForm (экземпляр = сообщение)
вернуть рендер (запрос, 'blog / post_delete.html',
{
'form': форма,
'post': сообщение,
})
шаблоны
Добавьте эти файлы в каталог blog / templates / blog
:
post_create.HTML
Добавить новое сообщение
post_edit.html
Редактировать сообщение
post_delete.HTML
Удалить сообщение
Полное руководство
Настройка
Выполните эти команды, чтобы настроить проект:
mkdir mysite && cd mysite
python3 -m venv venv
источник venv / bin / активировать
pip установить django
django-admin startproject mysite.блог python manage.py startapp
Отредактируйте файл проекта settings.py
и добавьте класс конфигурации приложения blog в список INSTALLED_APPS
:
INSTALLED_APPS = [
# ЗДЕСЬ
'blog.apps.BlogConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
Добавьте класс под названием Post
в блог app models.py
файл:
из моделей импорта django.db
класс Post (models.Model):
title = models.CharField (max_length = 255,
unique = True)
Выполнить миграцию:
python manage.py makemigrations && \
python manage.py мигрировать
Создать форму
Создайте файл с именем forms.py
в каталоге приложения blog и добавьте в него следующие строки:
из django.формы импортировать ModelForm
из .models import Post
класс PostForm (ModelForm):
класс Мета:
model = Опубликовать
fields = ['title']
-
ModelForm
- это вспомогательный класс, который позволяет нам создавать формы с использованием существующих моделей. - Используйте атрибут
fields
, чтобы определить, какие поля должна иметь форма.
Отредактируйте основной файл urls.py
и добавьте в него следующие строки:
от администратора импорта django.contrib
из джанго.путь импорта URL
# ЗДЕСЬ
из blog.views import post_create
urlpatterns = [
# ЗДЕСЬ
путь ('блог / создать /',
post_create,
name = 'post_create'),
путь ('admin /', admin.site.urls),
]
Отредактируйте файл blog app views.py
и добавьте в него функцию post_create
:
из django.shortcuts импорт рендеринга, перенаправление
из .forms import PostForm
from blog.models import Post
def post_create (запрос):
если запрос.method == 'POST':
form = PostForm (request.POST)
если form.is_valid ():
form.save ()
возврат перенаправления ('post_create')
еще:
form = PostForm ()
вернуть рендер (запрос,
'blog / post_create.html',
{
'form': форма
})
- Строка
if request.method == 'POST':
проверяет, была ли форма опубликована с использованием методаPOST
. - Форма
Объект
создается из данных запроса с использованием классаPostForm
, который мы создали ранее. - Если проверка формы прошла успешно, мы сохраняем объект в базе данных, используя
form.save ()
. - Предложение
else
выполняется, когда мы посещаем URL-адресblog / create /
, не отправляя форму. Нам нужно создать объектform
, даже если мы не публикуем никаких данных, чтобы пустая HTML-форма могла отображаться на странице. - Объект формы
render ()
контекст .Контекст - это словарь, который сопоставляет имена переменных шаблона с объектами Python.
Создайте файл с именем post_create.html
в каталоге blog / templates / blog
и добавьте в него следующие строки:
Добавить новое сообщение
-
csrf_token
обеспечивает защиту от подделок межсайтовых запросов . - {{form.as_p}} отображает поля формы с использованием тегов
Посетите / blog / create /
, чтобы создать элементы:
Редактировать форму
Отредактируйте файл проекта urls.py
и добавьте к нему следующий путь:
# ЗДЕСЬ
из blog.views import post_create, post_edit
urlpatterns = [
путь ('блог / создать /',
post_create,
name = 'post_create'),
# ЗДЕСЬ
путь ('blog / edit / /',
post_edit,
name = 'post_edit'),
путь ('admin /', admin.site.urls),
]
Отредактируйте файл blog app views.py
и добавьте в него функцию post_edit
:
из django.shortcuts import render, redirect, get_object_or_404
def post_edit (запрос, pk = None):
post = get_object_or_404 (Сообщение, pk = pk)
если request.method == "POST":
form = PostForm (request.POST,
instance = post)
если form.is_valid ():
form.save ()
возврат перенаправления ('post_create')
еще:
form = PostForm (экземпляр = сообщение)
вернуть рендер (запрос,
'blog / post_edit.html ',
{
'form': форма,
'post': сообщение
})
- Функция
get_objects_or_404 ()
используется для поиска записи в блоге, которую мы хотим отредактировать, используя ее первичный ключ. Он возвращает ошибку 404 Not Found , если объект не существует. - Мы передаем объект post в класс
PostForm
, используя параметрinstance = post
. Это заставляет методform.save ()
обновлять объект .Без него метод создал бы новый объект, как это происходит с представлениемpost_create
. - Экземпляр
= post
в предложенииelse
заполняет HTML-форму данными объекта, когда мы посещаем страницу без отправки запросаPOST
.
Создайте файл с именем post_edit.html
в каталоге blog / templates / blog
и добавьте в него следующие строки:
Редактировать сообщение
Посетите / blog / edit /
, чтобы изменить элемент:
Удалить форму
Отредактируйте файл blog / forms.py
и добавьте в него класс с именем PostDeleteForm
:
из django.forms import ModelForm
из .models import Post
класс PostForm (ModelForm):
класс Мета:
model = Опубликовать
fields = ['title']
# НАЧАЛО
класс PostDeleteForm (ModelForm):
класс Мета:
model = Опубликовать
fields = []
# КОНЕЦ
Измените URL-адреса .py
и добавьте к нему следующий путь:
от администратора импорта django.contrib
из пути импорта django.urls
# ЗДЕСЬ
from blog.views import post_create, post_edit, post_delete
urlpatterns = [
путь ('блог / создать /',
post_create,
name = 'post_create'),
путь ('blog / edit / /',
post_edit,
name = 'post_edit'),
# ЗДЕСЬ
путь ('блог / удаление / /',
post_delete,
name = 'post_delete'),
путь ('admin /', admin.site.urls),
]
Отредактируйте файл blog app views.py
и добавьте в него функцию с именем post_delete
:
из .forms import PostForm, PostDeleteForm
def post_delete (запрос, pk = None):
post = get_object_or_404 (Сообщение, pk = pk)
если request.method == "POST":
form = PostDeleteForm (request.POST,
instance = post)
если form.is_valid ():
post.delete ()
возврат перенаправления ('post_create')
еще:
form = PostDeleteForm (экземпляр = сообщение)
вернуть рендер (запрос, 'blog / post_delete.html ',
{
'form': форма,
'post': сообщение,
})
- Представление
post_delete
очень похоже на представлениеpost_edit
, но вместо обновления сообщения в блоге мы удаляем с помощьюpost.delete ()
.
Создайте файл с именем post_delete.html
в каталоге blog / templates / blog
и добавьте в него следующие строки:
Удалить сообщение