Модель форма: Создание форм из моделей — Документация 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:

  1. Валидация форм

  2. Валидация объекта модели

Как и валидация в обычной форме валидация в модельной форме выполняется при вызове 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, который были вызваны при валидации модели, определив ключ 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(). Этот метод создаёт и сохраняет объект в базе данных, используя для этого данные, введённые в форму. Класс, унаследованный от

ModelForm, может принимать существующий экземпляр модели через именованный аргумент 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).

Но если вы уверены в том, что делаете, вот как использовать этот подход:

  1. В параметре fields указать специальное значение '__all__', которое указывает использовать все поля модели. Например:

    from django.forms import ModelForm
    
    class AuthorForm(ModelForm):
        class Meta:
            model = Author
            fields = '__all__'
    
  2. Используйте атрибут exclude внутреннего класса ModelForm.Meta. Этот атрибут, если он указан, должен содержать список имён полей, которые не должны отображаться на форме.

    Например:

    class PartialAuthorForm(ModelForm):
        class Meta:
            model = Author
            exclude = ['title']
    

    Так как модель Author содержит три поля: ‘name’, ‘title ‘ и ‘birth_date’, то форма будут отображать поля name и birth_date.

При использовании одного из этих способов, порядок полей в форме будет аналогичен порядку полей в модели, ManyToManyField поля будут в конце.

Если поле модели содержит editable=False, каждая форма, созданная по модели с помощью ModelForm, не будет включать в себя это поле.

Изменено в Django 1.8:

В старых версиях, в форме будут представлены все поля модели, если не определить значения для 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 :

состоит из двух основных этапов.
  1. Проверка формы
  2. Проверка экземпляра модели

Как и при проверке нормальной формы, проверка формы модели запускается неявно при вызове 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).

Однако есть два ярлыка для случаев, когда вы можете гарантировать эти соображения безопасности к вам не относятся:

  1. Задайте для атрибута fields специальное значение '__all__' , чтобы указать что все поля в модели должны использоваться.Например:

     из django.forms import ModelForm
    
    класс AuthorForm (ModelForm):
        класс Мета:
            model = Автор
            fields = '__all__'
     
  2. Установите для атрибута 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 Автор будет представлен как