python - 如何在 models.py 中获取当前用户?
问题描述
您好我正在尝试添加用户列以了解是哪个用户在 tools/model.py 页面中添加了该工具
tools_name = models.CharField('Tool\'s Name', max_length=100, unique=True)
tools_project = models.ForeignKey(Project, on_delete=models.DO_NOTHING, null=True, blank=True, limit_choices_to=~Q(project_status=2), verbose_name='Project\'s Name')
user = models.CharField(max_length=100, editable=False)
但我想知道如何保存创建或更新工具的用户?
解决方案
模型通常是request unaware,所以你不应该这样做。这是属于视图的任务。此外,通常您使用一个ForeignKey
或一个OneToOneField
或另一个关系。这很有用,因为用户最终可能会更改他们的(用户)名称。通过存储用户名,您的数据库可以包含一个不再存在或更糟的用户名:另一个用户现在使用该用户名,然后该用户可以访问以前“所有者”的模型。
因此,您的模型如下所示:
from user.conf import settings
class MyModel(models.Model):
tools_name = models.CharField('Tool\'s Name', max_length=100, unique=True)
tools_project = models.ForeignKey(
Project,
on_delete=models.DO_NOTHING,
null=True,
blank=True,
limit_choices_to=~Q(project_status=2),
verbose_name='Project\'s Name'
)
user = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
editable=False
)
您可以使用ModelForm
例如,然后让视图设置用户:
from django.contrib.auth.decorators import login_required
from django.shortcuts import redirect
@login_required
def my_view(request):
if request.method == 'POST':
form = MyModelForm(request.POST, request.FILES)
if form.is_valid():
form.instance.user = request.user
form.save()
return redirect('name-of-some-view')
else:
form = MyModelForm()
return render(request, 'name-of-some-template.html', {'form': form})
对于ModelAdmin
您可以覆盖.save_model(…)
方法 [Django-doc]:
from django.contrib import admin
@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):
def save_model(self, request, obj, form, change):
obj.user = request.user
super().save_model(request, obj, form, change)
推荐阅读
- java - EMF (OCL) 将两个枚举合并为一个
- excel - 在受保护的工作表中取消保护特定范围
- java - 如何通过基本身份验证作为 RestAssured 中请求标头的一部分?
- java - 如何从可以在新 PDF 中选择文本的 WebView 导出 PDF
- javascript - 使用 jquery 滚动页面时添加引导类
- python - anaconda安装unicode cp950的问题
- tfs - 更新 tfs 2018 版本
- kubernetes - minikube 隧道抛出异常
- python - Dymola 崩溃/python 应该启动程序和脚本的重启
- java - 从其他 JFrame 控制 JCheckBox