我有一个FormView,它生成一个对象的回顾(通常与它有关),然后将它链接到对象并在表单完成时保存它。
我遇到的问题是我无法保留我想要连接的对象的数据。这意味着我需要“查找”上下文(模板呈现)以进行有效处理(进行链接)和成功(生成适当反转的URL。
是否有更好的方法将评论绑定到对象?或者更好的是,有没有办法保存我缺少的表单数据?
编辑:抱歉,登录装饰师正在派遣。我删除了那个方法因为SO抱怨代码太多而且我认为它不相关......我一定错过了decoratotclass 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},)
答案 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)