首页 > 解决方案 > Django:如何通过表单提交当前用户的用户名而无需用户输入

问题描述

我正在寻找一种简单的方法来让 django 表单在用户提交表单时在后台提交当前登录用户的用户名。我希望这会自动发生。

我在其他调用init函数的 stackoverflow 条目中看到了示例。但是,我发现这种方式非常混乱和冗长。

我正在使用 Django 2.2。

标签: pythondjangoforms

解决方案


我找到了一个很好的标准方法来做到这一点。

最好的方法是使用名为 CreateView 的通用基于类的视图。这是 Django 文档中的明确解释:

https://docs.djangoproject.com/en/2.2/topics/class-based-views/generic-editing/#models-and-request-user

我将在本说明中使用文档中的示例。

第一:使用表单的基本模型。这里没什么特别的。(模型.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 文档中提供的通过用户表单传递用户用户名的基本示例。这对我来说效果很好。


推荐阅读