1

我正在尝试将当前请求会话中的用户名存储到 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()时,调用的是自己的版本,不是我的覆盖;我的代码根本没有运行。

4

2 回答 2

1

执行此操作的“正确”方法是在通用视图不够用的情况下编写自己的对象创建视图。创建视图相对较短,并且有许多如何保存外键的示例。

于 2011-12-31T19:29:33.430 回答
0

顺便说一句,Django 的 1.3 文档在那里的某处说,正在“讨论”对管理应用程序使用的身份验证模型的修改,例如添加每个实例的权限。(当前的身份验证模型仅支持每个模型的权限。)开发人员也可能会为我想要实现的目标添加一个实现。毕竟,几乎所有网站都使用与用户相关的数据。

于 2011-12-31T21:31:08.363 回答