Как передать часть параметров для базы данных не из формы при отправке формы

Существует модель 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 шт):

Автор решения: Sherlock
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()})
→ Ссылка