Я нашел хороший, стандартный способ сделать это.
Лучшим способом является использование общего представления на основе классов под названием CreateView. Вот ясное объяснение в документах Django:
https://docs.djangoproject.com/en/2.2/topics/class-based-views/generic-editing/#models-and-request-user
Я буду использовать пример из документов в этом объяснении.
Первый: Используйте базовую модель для формы. Здесь нет ничего особенного. (models.py)
from django.contrib.auth.models import User
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=200)
created_by = models.ForeignKey(User, on_delete=models.CASCADE)
# ...
Секунда: Создание представления на основе классов. В этом представлении на основе классов измените «def form_valid (self, form)», как показано в примере с документами ниже. (views.py)
from django.contrib.auth.mixins import LoginRequiredMixin
from django.views.generic.edit import CreateView
from myapp.models import Author
class AuthorCreate(LoginRequiredMixin, CreateView):
model = Author
fields = ['name']
def form_valid(self, form):
form.instance.created_by = self.request.user
return super().form_valid(form)
Третье: Определить URL. Добавьте обычный as_view () для всех представлений на основе классов. (urls.py)
app_name = 'logs'
urlpatterns = [
path('', views.AuthorCreate.as_view(), name = "author_create"),
]
Четвертый: Общее представление на основе классов CreateView имеет имя шаблона по умолчанию, связанное с ним (см. документы django для CreateView ,под атрибутом "template_name"). Имя шаблона по умолчанию соответствует соглашению "authorcreate_form.html". Поэтому создайте HTML-шаблон с именем файла в соответствии с этим соглашением в папке шаблонов приложения. Следующий шаблон работал для меня. (.html)
<form method="POST" action="">
{% csrf_token %}
{{ form.as_p }}
<input type="submit">
</form>
Опять же, это базовый пример, приведенный в Django docs для передачи имени пользователя через форму пользователя. Это хорошо сработало для меня.