簡體   English   中英

Login_Required Django無法與FormView一起使用

[英]Login_Required Django Not Working With FormView

我有一個FormView,基本上是一個產品頁面。 您可以查看產品詳細信息並通過該頁面上的表單請求產品。 我希望設置頁面,以便任何人都可以查看該頁面,但是只有登錄的用戶才能請求該產品。 為此,我在FormView中的post函數中添加了一個login_required裝飾器,但出現錯誤:

'QueryDict'對象沒有屬性'user'

如何編碼此視圖/表單,使其按我描述的方式工作?

視圖:

class RedeemReward(SingleObjectMixin, FormView):
    template_name = 'reward.html'
    slug_field = 'reward_slug'
    form_class = Redeem_Reward
    model = Reward

    @method_decorator(login_required)
    def post(self, request, *args, **kwargs):
        return super(RedeemReward, self).post(request, *args, **kwargs)

    def form_valid(self, form):
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        #form = self.get_form(self.get_form_class())
        #form.save(self.request.POST)
        form.save(self.request.POST)
        return super(RedeemReward, self).form_valid(form)

    def get_success_url(self):
        return reverse('reward_confirmation', args=(self.object.reward_slug, self.object.reward_code))

    def dispatch(self, *args, **kwargs):
        self.object = self.get_object()
        return super(RedeemReward, self).dispatch(*args, **kwargs)

形成:

class Redeem_Reward(forms.Form):
    quantity = forms.IntegerField(label=_('Quantity'), error_messages={'invalid':'Must be a valid number'})
    reward_name = forms.CharField(max_length=50, widget=forms.HiddenInput(), label=_('Reward Name'), error_messages={'invalid':'Invalid reward'})
    def clean_quantity(self):
        """
        Validate that the user entered a valid number.
        """
        return self.cleaned_data['quantity']
    def clean_reward_name(self):
        """
        Validate that this reward code exists.
        """
        try:
            existing_reward = Reward.objects.get(reward_name=self.cleaned_data['reward_name'])
        except ObjectDoesNotExist:
            raise forms.ValidationError(_("The reward you requested does not exist."))
        return self.cleaned_data['reward_name']
    def save(self, request, *args, **kwargs):
        """
        Save all of the required data.
        """
        user = request.user
        #user_points = Points.objects.filter(affiliate__id=user.id).annotate(total_points=Sum('points'))
        user_points = Affiliate.objects.filter(points__affiliate__id=user.id).annotate(total_points=Sum('points'))
        user_points = user_points[0].total_points
        error_message = {'lookuperror':'You need to provide a valid quantity', 
                         'insufficient_points':"You don't have enough points for this purchase."}
        try:
            quantity = self.cleaned_data['quantity']
            reward_name = self.cleaned_data['reward_name']
            rewards = Reward.objects.get(reward_name=reward_name)
        except LookupError:
            raise Http404
        try:
            points_cost = -(rewards.reward_cost * quantity)
        except ArithmeticError:
            raise Http404
        quote_price = -(points_cost)
        if user_points >= quote_price:
            reward_order = Points.objects.create(affiliate=user, reward=rewards, points=points_cost, from_reward=True, from_offer=False, from_referral=False)
            status_cost = Status_Code.objects.create(short_name="Pending", name="The order is currently being reviewed", description="The order is in queue")
            redeem_order = Redeem.objects.create(affiliate=user, reward=rewards, status_code=status_code)
            redeem_details = Redeem_Details.objects.create(redeem=redeem_order, quantity=quantity, quote_price=quote_price)
            return HttpResponseRedirect(reverse('reward_confirmation', args=(redeem_details.redeem_code,)))
        else:
            return render(request, 'reward.html', {'error_message':error_message['insufficient_points']})

您正在將self.request.POST傳遞到表單的save方法,該方法設置為將請求作為第一個參數。 或至少具有user屬性的東西。 如果您傳遞self.request ,則將不再遇到該特定錯誤。

您要在form_valid方法中重新實例化form ,這很奇怪,該方法接收綁定的表單作為參數。

您要從表單的自定義保存方法返回HttpResponse對象,這是非標准的。 但是,只要您這樣做,就應該從form_valid方法返回它們。

總而言之,是這樣的:

def form_valid(self, form):
    return form.save(self.request)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM