【问题标题】:Django, class-views: How can I save session data with a form's object?Django,类视图:如何使用表单对象保存会话数据?
【发布时间】: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


【解决方案1】:

如果通用视图不够用,“正确”的方法是编写自己的对象创建视图。创建视图相对较短,有很多如何保存外键的示例。

【讨论】:

  • 对。但是 super().form_valid() 方法确实保存了这个对象:而且,添加到我的代码中也没有帮助。
  • 这完全在我自己的代码之外,在数据库后端。基本上,它保存在没有我添加的作者字段的地方:/usr/local/lib/python2.6/dist-packages/django/db/backends/sqlite3/base.py 在执行中,第 234 行
  • 用“真实”答案编辑。以前的意思是评论
  • 好吧,好吧。无论如何,我想我将不得不屈服并做到这一点。谢谢。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2018-05-24
    • 1970-01-01
    • 2016-07-25
    • 2021-12-21
    • 1970-01-01
    • 2016-03-04
    • 2016-07-31
    • 2020-10-20
    • 2012-09-11
    相关资源
    最近更新 更多