Атрибут fields

Атрибут fields применяется в классе CreateView и определяет набор полей модели, которые будут доступны для заполнения пользователю при создании нового объекта. Значение атрибута передается в качестве аргумента в форму, которая автоматически генерируется на основе модели. Атрибут может принимать список полей, кортеж или специальное значение '__all__' для включения всех полей модели.

Синтаксис

pythonfrom django.views.generic.edit import CreateView
from .models import ModelName

class ModelNameCreateView(CreateView):
  model = ModelName
  fields = ['field1', 'field2', 'field3']

Пример

Давайте создадим представление для создания статьи с указанием только необходимых полей:

pythonfrom django.views.generic.edit import CreateView
from .models import Article

class ArticleCreateView(CreateView):
  model = Article
  fields = ['title', 'content', 'category']
  template_name = 'article_create.html'
  success_url = '/articles/'

При обращении к этому представлению будет сгенерирована форма с полями 'title', 'content' и 'category'. Все остальные поля модели (например, 'created_at' или 'author') не будут отображаться в форме.

Пример

Давайте используем специальное значение '__all__' для включения всех полей модели:

pythonfrom django.views.generic.edit import CreateView
from .models import Article

class ArticleCreateView(CreateView):
  model = Article
  fields = '__all__'
  template_name = 'article_create.html'
  success_url = '/articles/'

В этом случае форма будет содержать все поля модели Article. Однако стоит быть осторожным с этим подходом, так как он может раскрыть поля, которые не должны редактироваться пользователем (например, поля с внешними ключами или автоматически вычисляемые).

Пример

Давайте укажем поля в виде кортежа для большей защиты от случайных изменений:

pythonfrom django.views.generic.edit import CreateView
from .models import Article

class ArticleCreateView(CreateView):
  model = Article
  fields = ('title', 'content', 'category')
  template_name = 'article_create.html'
  success_url = '/articles/'

Использование кортежа вместо списка не меняет логику работы, но может быть предпочтительнее с точки зрения неизменяемости данных. Форма все равно будет содержать те же поля: 'title', 'content' и 'category'.

Пример

Давайте рассмотрим полный пример работы с представлением и шаблоном для создания статьи:

python# views.py
from django.views.generic.edit import CreateView
from django.urls import reverse_lazy
from .models import Article

class ArticleCreateView(CreateView):
  model = Article
  fields = ['title', 'content', 'category']
  template_name = 'article_create.html'
  success_url = reverse_lazy('article_list')
python# models.py
from django.db import models

class Category(models.Model):
  name = models.CharField(max_length=100)

class Article(models.Model):
  title = models.CharField(max_length=200)
  content = models.TextField()
  category = models.ForeignKey(Category, on_delete=models.CASCADE)
  created_at = models.DateTimeField(auto_now_add=True)
article_create.html<form method="post">
  {% csrf_token %}
  {{ form.as_p }}
  <button type="submit">Create Article</button>
</form>

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

python"Article created successfully"

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

  • класс CreateView,
    который используется для создания новых объектов
  • атрибут fields,
    который определяет список полей для отображения в форме
  • класс UpdateView,
    который используется для редактирования существующих объектов
  • класс FormView,
    который предоставляет базовую функциональность для работы с формами