要在填写CreateView表单后重定向用户,我想从表单访问一个参数并将其传递给reverse_lazy函数。 如何在CreateView中访问表单的参数?
我实际上使用了我想要的参数来将其传递给表单本身(self.request.META.get('HTTP_REFERER').split('/')[-1]
),但是似乎无法在reverse_lazy中使用此逻辑。
get_form_kwargs也似乎没有达到结果:
views.py
class PieceInstanceCreate(LoginRequiredMixin, CreateView):
model = PieceInstance
fields = ['version', 'piece_image', 'status']
def form_valid(self, form):
obj = form.save(commit=False)
obj.piece = Piece.objects.get(id=self.request.META.get('HTTP_REFERER').split('/')[-1])
return super(PieceInstanceCreate, self).form_valid(form)
def get_form_kwargs(self):
kwargs = super(PieceInstanceCreate, self).get_form_kwargs()
return kwargs['piece']
success_url = reverse_lazy('piece-detail', kwargs={'pk': get_form_kwargs(self)})
urls.py
path('piece/<int:pk>', views.PieceDetailView.as_view(), name='piece-detail')
答案 0 :(得分:1)
您不会将其传递给reverse_lazy。代替使用success_url
,您应该定义get_success_url
方法,该方法允许您使用所需的任何参数动态创建URL。
但是,这里的代码还有其他一些错误。首先,您不应该尝试基于HTTP_REFERER属性进行所有计算。如果您的视图需要一些信息,则应将其作为关键字参数传递到URL中,然后可以使用self.kwargs
进入视图。在您的情况下,您的视图似乎已经具有pk参数;您可以使用self.kwargs['pk']
。
鉴于此,您的get_success_url
方法如下:
def get_success_url(self):
return reverse('piece-detail', kwargs={'pk': self.kwargs['pk')})
第二,您的get_form_kwargs
方法将始终给出KeyError; super方法不会返回带有“ piece”键的字典,即使这样做,该方法也必须返回字典,而不是单个值,包括所有相关项(如实际POST数据)。同样,您不清楚要使用此方法做什么。由于您未指定自定义表单,因此不需要自定义kwarg。您应该完全删除此方法。
最后,即使commit = False,也不需要在form_valid方法内调用form.save()
。 CreateView已经为表单分配了一个实例,因此您只需执行form.instance.piece = ...
。
答案 1 :(得分:1)
这里是重做的工作类(使用@DanielRoseman的输入):
class PieceInstanceCreate(LoginRequiredMixin, CreateView):
model = PieceInstance
fields = ['version', 'piece_image', 'status']
def form_valid(self, form):
form.instance.piece = Piece.objects.get(id=self.kwargs['pk'])
return super(PieceInstanceCreate, self).form_valid(form)
def get_success_url(self):
return reverse_lazy('piece-detail', kwargs={'pk': self.kwargs['pk']})
答案 2 :(得分:0)
使用 CBV 时不需要这样做 看看这个例子:
models.py
class Author(models.Model):
name = models.CharField(max_length=200)
def get_absolute_url(self):
return reverse('author-detail', kwargs={'pk': self.pk})
views.py
class AuthorCreate(CreateView):
model = Author
fields = ['name']