【问题标题】:Saving the user who created the model instance保存创建模型实例的用户
【发布时间】:2015-10-20 15:46:06
【问题描述】:

我的 Django 项目中有一个名为 Event 的模型:

from django.db import models
from django.contrib.auth.models import User


class Event(models.Model):
    organizer = models.CharField(blank=False, max_length=200) # TODO
    author = models.ForeignKey(User)

这个模型还附有一个表格:

从 django 导入表单 from .models 导入事件

class EventForm(forms.ModelForm):
    class Meta:
        model = Event
        fields = ['organizer',
                  ]

(还有其他字段,但不相关)

如果我想自动填充author 字段,最佳做法是什么?目前,保存模型的视图是这样保存的:

def event_created(request):
    form = EventForm(request.POST)
    if form.is_valid():
        obj = form.save(commit=False)
        obj.author = request.user
        obj.save()

这个工作,但我很担心,因为这意味着当其他视图保存它时,它必须跳过相同的循环。有没有办法告诉模型本身“当我救你时,将用户设置为当前用户”?问题是模型不知道是哪个请求触发了它的保存,如果我从视图中提供请求,那似乎又是代码重复......

【问题讨论】:

  • @madzohan 这个答案声称模型表单应该保存用户,但您仍然必须将请求发送到它的保存方法。那是如何节省任何东西的?
  • form = EventForm(request.POST, request=request); if form.is_valid(): form.save() ...如果您想要更清晰的代码 - 使用基于类的视图

标签: python django


【解决方案1】:

一种方法是将request 对象传递给EventForm,并在保存时使用此request 对象获取用户。

您可以通过EventForm(request.POST, request=request) 创建表单实例来做到这一点。

class EventForm(forms.ModelForm):

   def __init__(self, *args, **kwargs):
       self.request = kwargs.pop('request', None) # set 'request' if passed as kwarg
       return super(EventForm, self).__init__(*args, **kwargs)

然后在表单的save() 方法中,您可以将保存author 的逻辑从您的event_created 视图中移至它。

但为此,您必须确保每次创建表单实例时都传递request,以便将author 设置为request.user

我建议您使用原始方法,因为它整洁干净。您不必担心每次都传递request 并覆盖EventForm__init__() 方法和save() 方法。

【讨论】:

  • 但这比我目前的解决方案更好吗?它仍然要求我在视图中重复代码,不是吗?
  • 是的,代码中会有一些重复,但否则你必须确保到处都是request。如果您错过了通过requestsave() 中会出现验证错误。如果你能确保万无一失,那么确定你可以使用上面发布的其他方法。如果使用FormView CBV 会更干净。
【解决方案2】:

here回答了一个类似的问题。

基本上,模型可以在更多地方创建和更新,而不仅仅是一个视图(管理命令和保存后监听器)。在这些情况下,我们不会要求更新用户是谁。

【讨论】:

  • 那么,根据你的意见,我做的是最好的?
  • 我想是的。我真的想不出一个适用于所有情况的解决方案。
猜你喜欢
  • 2021-06-19
  • 2017-12-30
  • 2022-11-21
  • 2021-11-16
  • 2017-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-31
相关资源
最近更新 更多