我想在成功提交表单后添加一条消息,其中部分消息涉及来自apps模型的参数值。
我尝试使用如下方法:
views.py:
class ApplyView(FormView):
template_name = 'vouchers/apply.html'
model = Voucher
form_class = VoucherApplyForm
def form_valid(self, form):
self.code = form.cleaned_data['code']
now = timezone.now()
Voucher.objects.filter(code__iexact=self.code,
valid_from__lte=now,
valid_to__gte=now,
usage_limit=3,
active=True)
form.apply_voucher()
return super(ApplyView, self).form_valid(form)
def get_success_url(self, voucher_id):
voucher = Voucher.objects.filter(pk=voucher_id)
discount_value = voucher.value
discount_type = voucher.get_type_display
messages.add_message(self.request, messages.INFO,
"Congratulations! You've successfully redeemed %s"
" %s off the selected item(s)." % (
discount_value,
discount_type,
))
return reverse('vouchers:apply', kwargs={'voucher_id': self.kwargs['voucher_id']})
urls.py:
urlpatterns = [
path('<int:pk>/', views.VoucherDetailView.as_view(), name='detail'),
path('<int:voucher_id>/apply/', views.ApplyView.as_view(), name='apply'),
]
但是,我收到了TypeError:
return HttpResponseRedirect(self.get_success_url())
TypeError: get_success_url() missing 1 required positional argument: 'voucher_id'
非常感谢您的帮助。干杯!
答案 0 :(得分:1)
get_success_url
。根据定义,它除self
外没有其他参数。如果需要在该方法上定义其他参数,则需要更新调用方以提供它们。这意味着您将需要重写一些其他方法。
另一种选择,我怀疑您更喜欢使用的一种选择是从视图实例的kwargs中获取voucher_id
。可以使用self.kwargs['voucher_id']
def get_success_url(self):
voucher = Voucher.objects.get(pk=self.kwargs['voucher_id'])
...