如何在Django的views.py中从models.py调用特定字段

时间:2019-10-15 20:25:01

标签: python django typeerror

我想在成功提交表单后添加一条消息,其中部分消息涉及来自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'

非常感谢您的帮助。干杯!

1 个答案:

答案 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'])
    ...