【问题标题】:Django: How to submit the current user's username through a form without the user having to enter itDjango:如何通过表单提交当前用户的用户名而无需用户输入
【发布时间】:2020-02-13 20:57:51
【问题描述】:

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

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

我正在使用 Django 2.2。

【问题讨论】:

标签: python django forms


【解决方案1】:

我找到了一种很好的标准方法。

最好的方法是使用名为 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 中提供的通过用户表单传递用户用户名的基本示例。这对我很有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-30
    • 1970-01-01
    相关资源
    最近更新 更多