Django类视图:如何使用表单对象保存会话数据?
我想把当前请求的会话中的用户名存储到一个数据库对象里。我该如何在一个基于类的视图中做到这一点?有没有什么“干净”的方法?我应该重写或子类化什么呢?
我有一个模型,长得像这样:
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 }}
。据我所知,会话和认证的应用程序/中间件设置得很好——就像新 Django 项目的默认设置一样。
我找到了一篇 帖子,它讨论的内容和我想做的差不多,但角度不对,而且使用的是函数视图。
到目前为止,我的想法是重写表单类中的某些内容,把用户名插入到清理后的数据里。有没有更好的方法?有没有一种正确的方法?
编辑:到目前为止的解决方案不成功,出现了一个完整性错误:author_id 不能为 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() 时,它调用的是它自己版本的方法,而不是我重写的;我的代码根本没有运行。
2 个回答
顺便提一下,Django 1.3 的文档里提到,关于管理员应用使用的认证模型的修改正在“讨论”中,比如说增加每个实例的权限。(现在的认证模型只支持按模型的权限。)开发者们可能还会添加一个实现,来满足我想要达到的目标。毕竟,几乎所有网站都需要用户相关的数据。
如果通用的视图不够用,最好的办法就是自己写一个对象创建的视图。创建视图通常比较简单,而且有很多关于如何保存外键的例子可以参考。