Django,类视图:如何使用表单的对象保存会话数据?

时间:2011-12-31 13:29:14

标签: python django classview

我正在尝试将当前请求会话中的用户名存储到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不能为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 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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