持久化Django FormView D

2024-04-26 12:11:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个FormView,它生成对一个对象(它通常与之相关)的审查,然后将其链接到该对象,并在表单完成时保存它。在

我遇到的问题是我无法保存我想要连接的对象的数据。这意味着我需要“查找”上下文(模板呈现)的有效处理(进行链接)和成功(生成适当的反向url)。在

有没有更好的方法将评论绑定到对象?或者更好的是,有没有一种方法可以持久化我丢失的表单数据?在

编辑:抱歉,登录装饰器正在调度中。我删除了这个方法,因为SO抱怨代码太多,我认为它不相关。。。我一定是错过了装饰工

class ReviewCreate(FormView):
    template_name = 'food/item_add_review.html'
    form_class = ReviewForm
    review_item = None


    def get_context_data(self, **kwargs):
        context = super(ReviewCreate, self).get_context_data(**kwargs)

        item_modelname = self.kwargs.get('model')
        item_model = apps.get_model('food',item_modelname)
        review_item = get_object_or_404(item_model,pk=self.kwargs.get('pk'))

        context['item'] = review_item

        return context

    def form_valid(self, form):
        item_modelname = self.kwargs.get('model')
        item_model = apps.get_model('food',item_modelname)
        review_item = get_object_or_404(item_model,pk=self.kwargs.get('pk'))

        r = form.save(commit=False)

        r.content_object=review_item
        r.save()

        return super(ReviewCreate, self).form_valid(form)

    def get_success_url(self): 
        item_modelname = self.kwargs.get('model')
        item_model = apps.get_model('food',item_modelname)
        review_item = get_object_or_404(item_model,pk=self.kwargs.get('pk'))

        return reverse( 'pkitem', kwargs = {'pk': review_item.id, 'model':item_modelname},)

Tags: 对象方法selfformgetmodelobjectfood
3条回答

get_context_data应该始终返回上下文字典。使用login_required修饰符没有意义,因为这意味着它可能会返回重定向响应。在

最好改为装饰dispatch方法。在dispatch中,可以设置实例的属性。在

class ReviewCreate(FormView):

    @method_decorator(login_required)
    def dispatch(self, request, *args, **kwargs):
        self.item_modelname = self.kwargs.get('model')
        self.item_model = apps.get_model('food',item_modelname)
        self.review_item = get_object_or_404(item_model,pk=self.kwargs.get('pk'))
        return super(ReviewCreate, self).dispatch(request, *args, **kwargs)

然后,在其他方法中,可以访问属性,例如:

^{pr2}$

视图是一个对象,所以您只需将值赋给实例变量,即“toself”(this is thread-safe)。像这样:

class ReviewCreate(FormView):
    template_name = 'food/item_add_review.html'
    form_class = ReviewForm

    @method_decorator(login_required)  # Use a class level mixin instead
    def get_context_data(self, **kwargs):
        return super(
            ReviewCreate, 
            self
        ).get_context_data(
            item=self.review_item,
            **kwargs
        )

    def lookup_review_item(self):
        self.item_modelname = self.kwargs.get('model')
        item_model = apps.get_model('food', self.item_modelname)
        self.review_item = get_object_or_404(
            item_model, 
            pk=self.kwargs.get('pk')
        )

    def dispatch(self, request, *args, **kwargs):
        # lookup performed here to be set for both GET and POST
        self.lookup_review_item()
        return super(ReviewCreate, self).dispatch(request, *args, **kwargs)

    def form_valid(self, form):
        r = form.save(commit=False)
        r.content_object=self.review_item
        r.save()
        return super(ReviewCreate, self).form_valid(form)

    def get_success_url(self):
        return reverse(
            'pkitem', 
            kwargs = {
                'pk': self.review_item.id, 
                'model': self.item_modelname
            },
        )

{{{2>重新初始化cd1}>表单的默认值。可以通过重写form_valid()使表单数据保持不变:

def form_valid(self, form):
    return super(YourFormView, self).get(form)

这将重定向到带有已发布数据的(有界)表单的成功url。表单将添加到上下文中,以便您可以根据需要在模板或视图中使用数据。在

(Django版本1.11.7)

相关问题 更多 >