python - Django:如何通过表单提交当前用户的用户名而无需用户输入
问题描述
我正在寻找一种简单的方法来让 django 表单在用户提交表单时在后台提交当前登录用户的用户名。我希望这会自动发生。
我在其他调用init函数的 stackoverflow 条目中看到了示例。但是,我发现这种方式非常混乱和冗长。
我正在使用 Django 2.2。
解决方案
我找到了一个很好的标准方法来做到这一点。
最好的方法是使用名为 CreateView 的通用基于类的视图。这是 Django 文档中的明确解释:
我将在本说明中使用文档中的示例。
第一:使用表单的基本模型。这里没什么特别的。(模型.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 文档中的 CreateView,在“template_name”属性下)。默认模板名称遵循“authorcreate_form.html”的约定。因此,在应用程序的模板文件夹中创建一个文件名遵循该约定的 html 模板。以下模板对我有用。(.html)
<form method="POST" action="">
{% csrf_token %}
{{ form.as_p }}
<input type="submit">
</form>
同样,这是Django 文档中提供的通过用户表单传递用户用户名的基本示例。这对我来说效果很好。
推荐阅读
- java - 流并行加载到着色器存储缓冲区对象
- php - 在 PHP 中使用带有 where 子句的 PDO 选择记录
- elasticsearch - 在 Elasticsearch 中查找特定时间带有过滤器的文档数
- javascript - 使用`forEach`向表中添加多行而不影响浏览器性能
- python - VS代码中的Python开发在没有错误的情况下显示错误?
- c# - 无需等待的响应式表单
- postgresql - 优化 PostgreSQL/TimeScaleDB 查询的方法
- html - 如何在不同的 z-index 图层中显示验证码图像而不影响底层?
- python-3.x - 如何按最小值过滤python字典并返回高于最小值的新字典?
- swift - 在 Cocoa 应用程序的 Apple Swift 5 子类中正确调用 init 函数