我正在尝试将当前请求会话中的用户名存储到 db 对象中。如何从基于类的视图中执行此操作?有没有“干净”的方法来做到这一点?我应该覆盖/子类什么?
我有一个看起来像这样的模型:
from django.contrib.auth.models import User
class Entry(django.db.models.Model):
...
author = models.ForeignKey(User, editable=False)
我还有一个基于内置通用视图的视图django.views.generic.CreateView
。我还使用了与我的模型一起使用的默认 ModelForm 类,以及{{ form }}
我的模板中的默认类。AFAIK,会话和身份验证应用程序/中间件已正确设置——按照新 Django 项目中的默认设置。
我发现了这篇文章,它的内容大致相同,但角度不对,而是使用了函数视图。
到目前为止,我的想法是覆盖表单类中的某些内容并将用户名插入到清理后的数据中。有没有更好的办法?有正确的方法吗?
编辑:到目前为止的解决方案,不起作用,带有 IntegrityError: author_id cannot be null
from django.views.generic import CreateView
class Index(CreateView):
model = magicModel
template_name = "index.html"
success_url = "/magicWorked"
...
def form_valid(self, form):
self.object = form.save(commit=False)
self.object.author = request.user
return super(Index, self).form_valid(form)
我根据我在 django/views/generic/edit.py 中找到的内容编写了这个,它将此实现用于类 ModelFormMixin:
def form_valid(self, form):
self.object = form.save()
return super(ModelFormMixin, self).form_valid(form)
这是上面 super().form_valid() 调用的方法。
编辑:我的解决方案的问题是我对 Python 的继承模型的理解。超类调用form_valid()时,调用的是自己的版本,不是我的覆盖;我的代码根本没有运行。