坚持Django FormView数据

时间:2016-03-05 08:48:29

标签: python django django-forms django-views

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

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

是否有更好的方法将评论绑定到对象?或者更好的是,有没有办法保存我缺少的表单数据?

编辑:抱歉,登录装饰师正在派遣。我删除了那个方法因为SO抱怨代码太多而且我认为它不相关......我一定错过了decoratot

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},)

3 个答案:

答案 0 :(得分:1)

视图是一个对象权限,因此您只需将值分配给实例变量,即自己" (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
            },
        )

答案 1 :(得分:0)

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)

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

    def get_context_data(self, **kwargs):
        context = super(ReviewCreate, self).get_context_data(**kwargs)
        context['item'] = self.review_item
        return context

答案 2 :(得分:0)

<?php session_start(); <?php $r=session_id();?> <?php include('include/config.php');?> $sql = mysqli_query($connection, "INSERT INTO `mobile_message` SET `mobile` = '$mobile'"); if($sql){ $cid=$_POST['mobile']; $_SESSION['cid']=$cid; $_SESSION['s']= "OTP sent to your mobile."; header('Location:sign2.php'); } else{ $_SESSION['e']= "Could not able to execute. "; header('Location:sign.php'); } 的默认form_valid()方法会重定向到成功网址并重新初始化表单。您可以通过覆盖FormView

来保持表单数据的持久性
form_valid()

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

(Django版本1.11.7)