Атрибут fields
Атрибут fields применяется в классе CreateView
и определяет набор полей модели, которые будут доступны
для заполнения пользователю при создании нового объекта.
Значение атрибута передается в качестве аргумента в форму,
которая автоматически генерируется на основе модели.
Атрибут может принимать список полей, кортеж или специальное
значение '__all__' для включения всех полей модели.
Синтаксис
from django.views.generic.edit import CreateView
from .models import ModelName
class ModelNameCreateView(CreateView):
model = ModelName
fields = ['field1', 'field2', 'field3']
Пример
Давайте создадим представление для создания статьи с указанием только необходимых полей:
from 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__'
для включения всех полей модели:
from 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. Однако стоит быть осторожным с этим
подходом, так как он может раскрыть поля, которые
не должны редактироваться пользователем (например,
поля с внешними ключами или автоматически вычисляемые).
Пример
Давайте укажем поля в виде кортежа для большей защиты от случайных изменений:
from 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'.
Пример
Давайте рассмотрим полный пример работы с представлением и шаблоном для создания статьи:
# 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')
# 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)
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Create Article</button>
</form>
Результат выполнения кода при успешном создании статьи:
"Article created successfully"
Смотрите также
-
класс
CreateView,
который используется для создания новых объектов -
атрибут
fields,
который определяет список полей для отображения в форме -
класс
UpdateView,
который используется для редактирования существующих объектов -
класс
FormView,
который предоставляет базовую функциональность для работы с формами