代码之家  ›  专栏  ›  技术社区  ›  Gonzalo Quero

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

  •  11
  • Gonzalo Quero  · 技术社区  · 17 年前

    class Post(models.Model):
        text = models.TextField()
        author = models.ForeignKey(User)
    

    5 回复  |  直到 5 年前
        1
  •  3
  •   David Berger    17 年前

    编写一个上下文处理器:

    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 {}
    

    然后在你的url配置文件中:

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

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

        2
  •  3
  •   B. Slavin    16 年前

    from django.forms import ModelForm
    from django.views.generic.create_update import create_object, update_object
    
    def make_foo_form(request):
        class FooForm(ModelForm):
            class Meta:
                model = Foo
                fields = ['foo', 'bar']
    
            def save(self, commit=True):
                f = super(FooForm, self).save(commit=False)
                if not f.pk: f.user = request.user
                if commit: f.save()
                return f
    
        return FooForm
    
    def create_foo(request):
        FooForm = make_foo_form(request)
        return create_object(form_class=FooForm)
    

    您需要决定表单创建增加的复杂性是否值得在视图方面保持简单性。

    def update_foo(request, object_id):
        FooForm = make_foo_form(request)
        return update_object(form_class=FooForm, object_id=object_id)
    

    显然,您也可以将这种方法用于更复杂的情况。

        3
  •  1
  •   Powerlord    17 年前

    如果用户经过身份验证,则他们的用户对象是 request.user 对象。

    我不熟悉create_object。..我仍然是django的初学者,刚刚开始我的第一个真正的项目。

    请注意,在使用此功能之前,您应该检查以确保用户已登录。这可以通过以下方式完成 request.user.is_authenticated() .

        4
  •  0
  •   Carl Meyer    17 年前

    在使用当前的Django通用视图时,没有好的方法可以挂接到对象的保存中。一旦他们 rewritten as classes ,您将能够子类化视图并在适当的位置挂接,而无需重写整个视图。

    出于这个原因,我已经使用了自己的基于类的通用视图。

        5
  •  0
  •   Andres Andres    17 年前

    我建议按照作者的建议,为create_object制作一个包装器 http://www.b-list.org/weblog/2006/nov/16/django-tips-get-most-out-generic-views/ 在视图中,您将可以访问用户信息。 之后,您需要使用extra_context将用户传递给模板。最后,在模板中,您可以添加一个包含用户信息的隐藏字段。我还没有试过,但我已经想了很长时间了。希望这个解决方案适合您!