【问题标题】:Where to place logic in a Class Base View?将逻辑放置在类基础视图中的什么位置?
【发布时间】:2014-06-11 07:26:22
【问题描述】:

我想了解在 Class Base View 的哪个位置我会为以下内容执行逻辑:

基本上,我想检查用户是否有帐户,如果有,则将其转发到 URL A,否则将其转发到 URL B。但是,我不能 100% 确定 get_success_url() 是否是 CBV 中的最佳位置或者如果 Django 有一些已经满足这个用例的东西。我见过其他像 RedirectView 这样的 CBV 我已经尝试过这个但失去了范围。请记住,我需要传递用户 ID。

这是我到目前为止所达到的目标:

class CampaignView(BaseUpdateView):
    form_class = UserLookUpFrom
    model = Campaign


    def get_context_data(self, **kwargs):
        context = super(CampaignView, self).get_context_data(**kwargs)
        # context['form'] = AppUserLookUpFrom

        return context


    def form_valid(self, form):
        """
        If the form is valid, in this case DON'T save it!
        """
        return super(CampaignView, self).form_valid(form)


    def get_success_url(self):

        """
        Returns the supplied URL.
        """
        if self.success_url:
            url = self.success_url % self.object.__dict__
        else:
            try:
                currect_user = Campaign.object.get_user_by_email(EMAIL HERE DONT KNOW HOW TO GET THIS YET FROM FORM)
                if currect_user:
                         url = reverse('campaigns_login', args=(self.object.id,'self.userid'))
                else:
                         url = reverse('campaigns_register', args=(self.object.id)



            except AttributeError:
                raise ImproperlyConfigured(
                    "No URL to redirect to.  Either provide a url or define"
                    " a get_absolute_url method on the Model.")
        return url

【问题讨论】:

    标签: python django


    【解决方案1】:

    我认为它应该在 CampaignView 的帖子中:

    def post(self, request, *args, **kwargs):
       form= self.form_class(request.POST)
       if form.is_valid():
          user_email= form.cleaned_data['email']
          user_of_campaign= Campaign.objects.filter(email= user_email)
          if len(user_of_campaign)>0:
             return redirect('/login', user_of_campaign[0].id)
          else: 
             return redirect('/register')
          return super(CampaignView, self).form_valid(form)
       return super(CampaignView, self).form_invalid(form)
    

    【讨论】:

    • 您好,谢谢。你能解释一下最后两个回归超级吗?我不知道第二个会如何工作。
    • 第二个,如果表单无效则返回到初始表单页面。
    【解决方案2】:

    您可以在 form_valid 本身中执行此操作。这是一个未经测试的代码,应该有助于解释这个概念:

    from django.shortcuts import redirect
    
    def form_valid(self, form):
        email = form.cleaned_data.get("email", "")
        prev_user = Campaign.object.filter(email=email)
        if prev_user:
           return redirect('campaigns_login', self.object.id, prev_user[0].userid)
        else:
           return redirect('campaigns_register', self.object.id)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-12
      • 2018-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-16
      相关资源
      最近更新 更多