【发布时间】:2011-12-31 13:29:13
【问题描述】:
我正在尝试将当前请求会话中的用户名存储到 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 项目中的默认设置。
我发现了这个post,它的用途大致相同,但角度不对,而是使用函数视图。
到目前为止,我的想法是覆盖表单类中的某些内容并将用户名插入到清理后的数据中。有没有更好的办法?有没有正确的方法?
编辑:到目前为止的解决方案,无效,带有 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() 时,它调用它的自己的 版本,而不是我的覆盖;我的代码根本没有运行。
【问题讨论】:
-
请向我们展示您的尝试。
-
我现在正在编写一些东西。我希望有一个“最佳实践”或快速的 Django 功能。
标签: python django django-class-based-views