我找到了一种很好的标准方法。
最好的方法是使用名为 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)
第三:定义网址。根据所有基于类的视图添加常规的“as_view()”。 (urls.py)
app_name = 'logs'
urlpatterns = [
path('', views.AuthorCreate.as_view(), name = "author_create"),
]
第四: CreateView 基于类的通用视图有一个链接到它的默认模板名称(参见django docs for CreateView,在“template_name”属性下)。默认模板名称遵循“authorcreate_form.html”的约定。因此,在应用程序的模板文件夹中创建一个文件名遵循该约定的 html 模板。以下模板对我有用。 (.html)
<form method="POST" action="">
{% csrf_token %}
{{ form.as_p }}
<input type="submit">
</form>
同样,这是Django docs 中提供的通过用户表单传递用户用户名的基本示例。这对我很有效。