Как передать часть параметров для базы данных не из формы при отправке формы
Существует модель Articles с обязательными полями title, body, create_datetime, author, tags и status. Необходимо, чтобы часть из этих параметров бралась из формы, а другая часть из кода. На данный момент forms.py выглядит так:
from Main.models import Articles
from django.forms import ModelForm, TextInput, Textarea, Select
class CreateArticleForm(ModelForm):
class Meta:
model = Articles
fields = ["title", "body", "tags", "status"]
widgets = {
"title": TextInput(
attrs={
'type': "text",
'placeholder': "Название статьи",
'class': "form-control"
}
),
"body": Textarea(
attrs={
'placeholder': "Текст статьи",
'class': "form-control"
}
),
"tags": TextInput(
attrs={
'type': "text",
'placeholder': "Теги статьи",
'class': "form-control"
}
),
"status": Select(choices=(
("published", "Публикация"),
("draft", "Черновик"),
),
attrs={
'class': "form-control"
}
)
}
views.py так:
from django.shortcuts import render
from html_forms.forms import CreateArticleForm
def createarticle(request):
if request.method == 'POST':
form = CreateArticleForm(request.POST)
if form.is_valid():
form.save()
return render(request, 'html_forms/create_article_form.html',
{
'form': CreateArticleForm()
}
)
Попытки реализовать заключались в следующем: В forms.py в списке fields вместе с текущими ключами также добавлялись "create_datetime" и "author", после чего в views.py при вызове класса CreateArticleForm помимо request.POST пытался добавить
create_datetime=datetime.datetime.now().strftime("%d-%m-%Y %H:%M:%d"), author=request.user.get_username()
, так что получалось
form = CreateArticleForm(request.POST,
create_datetime=datetime.datetime.now().strftime("%d-%m-%Y %H:%M:%d"),
author=request.user.get_username())
,разумеется при этом импортировал datetime. Django же при попытке перейти на страницу с формой ругался, что я передаю атрибуты, которые не требуются.
Так же были попытки в файле forms.py в словаре widgets дописать примерно то же самое, но Django уже при старте сервера писал AttributeError: 'str' object has no attribute 'is_required'. Прошерстил много форумов и документаций разных версий, но нашёл только что-то похожее только с самой моделью, а не формой, и там как раз делалось то же самое, что я пытался делать в первый раз, только, разумеется, без request.POST.
Вариант с невидимыми и автоматически заполненными полями в форме небезопасный, так что он отпадает.
Ответы (1 шт):
if form.is_valid():
form.save(commit=False)
form.author = request.user
form.save()
Так и с другими полями, при этом поле author установите необязательным.
Так же, вы можете указать auto_now_add=True в модели publish, таким образом, в дату публикации автоматически будет записываться дата создания записи, но при этом, поле станет не доступным для редактирования.
UPD: models:
author = models.ForeignKey(User, on_delete=models.CASCADE, null=True, verbose_name='Автор')
pub_date = models.DateTimeField(auto_now_add=True)
В forms эти поля не указываете.
views:
def createarticle(request):
if request.method == 'POST':
form = CreateArticleForm(request.POST)
if form.is_valid():
instance = form.save(commit=False)
instance.author = request.user
instance.save()
return render(request, 'html_forms/create_article_form.html',{'form': CreateArticleForm()})