Атрибут prefix

Атрибут prefix класса Form позволяет задать уникальный префикс для всех полей формы. Этот префикс добавляется к имени каждого поля, что особенно полезно, когда на одной странице используется несколько экземпляров одной и той же формы. Благодаря этому данные каждой формы обрабатываются независимо, а при отправке они не смешиваются.

Значение атрибута передаётся либо как параметр при создании экземпляра формы, либо определяется внутри класса формы. Если префикс не задан, поля формы будут иметь стандартные имена, что может привести к конфликтам при использовании нескольких форм.

Синтаксис

pythonclass MyForm(Form):
  name = CharField()
  age = IntegerField()

# Создание формы с префиксом
form = MyForm(prefix='user')

После указания префикса все поля формы в HTML будут иметь имена вида 'user-name' и 'user-age'. При передаче данных в форму необходимо использовать эти имена.

Пример

Рассмотрим простой пример: на странице используются две формы для ввода данных пользователя. Первая форма предназначена для основного пользователя, вторая - для дополнительного. Без префикса поля форм перезаписывали бы друг друга, поэтому мы используем prefix:

pythonfrom django import forms

class UserForm(forms.Form):
  username = forms.CharField(max_length=100)
  email = forms.EmailField()

# Создаём две формы с разными префиксами
form1 = UserForm(prefix='main')
form2 = UserForm(prefix='extra')

Теперь в HTML имена полей первой формы будут 'main-username' и 'main-email', а второй - 'extra-username' и 'extra-email'.

Пример

При обработке данных формы также необходимо учитывать префикс. Django автоматически добавляет префикс к именам полей, поэтому при передаче данных в форму нужно использовать имена с префиксом:

pythonfrom django import forms
from django.http import HttpResponse

class UserForm(forms.Form):
  username = forms.CharField(max_length=100)
  email = forms.EmailField()

def register_users(request):
  if request.method == 'POST':
    # Привязываем данные к форме с префиксом 'main'
    form = UserForm(request.POST, prefix='main')
    if form.is_valid():
      # Обработка данных
      username = form.cleaned_data['username']
      email = form.cleaned_data['email']
      return HttpResponse(f"User {username} registered with email {email}")
  else:
    form = UserForm(prefix='main')
  # Рендеринг формы
  return render(request, 'register.html', {'form': form})

Результат выполнения кода при успешной отправке формы:

python"User john registered with email john@example.com"

Пример

Префикс также можно использовать для динамического создания форм, например, в форме для редактирования нескольких объектов одновременно. Здесь каждая форма получает уникальный префикс, основанный на идентификаторе объекта:

pythonfrom django import forms
from myapp.models import Article

class ArticleForm(forms.ModelForm):
  class Meta:
    model = Article
    fields = ['title', 'content']

def edit_articles(request):
  articles = Article.objects.all()
  forms_list = []
  for article in articles:
    # Используем id статьи как префикс
    form = ArticleForm(instance=article, prefix=f'article_{article.id}')
    forms_list.append(form)
  # Рендеринг списка форм
  return render(request, 'edit_articles.html', {'forms': forms_list})

При отправке данных каждая форма будет обрабатываться отдельно, так как поля имеют уникальные префиксы, например 'article_1-title', 'article_2-title' и так далее.

Смотрите также

  • атрибут initial,
    который задаёт начальные значения полей формы
  • метод is_valid,
    который выполняет валидацию данных формы
  • атрибут cleaned_data,
    который содержит валидированные данные формы
  • метод save,
    который сохраняет данные модели в базу данных