使用django中的通用create_object视图设置对象所有者

Gon*_*ero 10 python django

是否可以使用create_object视图创建新对象并自动将request.user作为外键?

PE:

class Post(models.Model):
    text = models.TextField()
    author = models.ForeignKey(User)
Run Code Online (Sandbox Code Playgroud)

我想要的是使用create_object并使用request.user填充作者.

Dav*_*ger 3

从很多方面来说,解决这个问题的所有解决方案都会带来更多的麻烦,而不是其价值。这属于黑客行为。如果 django 更新改变了 create_update 的实现方式,则可能会让您陷入困境。为了简单起见,我假设您正在尝试设置默认用户,而不是默默地强制该用户成为登录用户。

编写一个上下文处理器:

from django.views.generic.create_update import get_model_and_form_class
def form_user_default(request):
    if request.method == 'GET':
        model, custom_form = get_model_and_form_class(Post,None)
        custom_form.author = request.user
        return {'form':custom_form}
    else: return {}
Run Code Online (Sandbox Code Playgroud)

这将覆盖 create_update 传递给模板的表单对象。从技术上讲,它的作用是在默认视图完成后重新创建表单。

然后在你的网址配置中:

url(r'pattern_to_match', 'django.views.generic.create_update.create_object', kwargs={'context_processors':form_user_default})
Run Code Online (Sandbox Code Playgroud)

同样,我必须深入研究源代码才能弄清楚如何做到这一点。最好尝试编写自己的视图(但要包含尽可能多的 Django 自定义对象)。没有“简单的默认”方法可以做到这一点,因为在 django 范式中,表单与模型层的联系比与视图的联系更紧密,并且只有视图才知道请求对象。