2014-03-13 25 views
0

對於Django 1.6,這是我最終的代碼。邏輯是,如果用戶不存在數據庫對象,則轉到'account_add'添加帳戶。我不想使用user_profile或直接針對特定問題修改用戶對象,因此請不要提出這些問題。我想知道的是,如果這段代碼編寫得很好,或者寫得更好,更高效?UpdateView和CreateView - 代碼是否有效或可以改進?

class AccountCreateOrModify(): 
    model = Employee 
    form_class = AccountForm 
    template_name = 'bot_data/account_modify.html' 
    success_url = reverse_lazy('home') 


class ViewEmployee(LoginRequiredMixin, 
     DetailView): 

    model = Employee 
    template_name = 'bot_data/employee_detail.html' 

    def dispatch(self, request, 
      *args, **kwargs): 
     try: 
      pk = self.request.user.pk 
      queryset = self.model.objects.get(user_assigned=pk) 
      return super(ViewEmployee, 
        self).dispatch(request, 
          *args, **kwargs) 
     except Employee.DoesNotExist: 
      return redirect('account_add') 

    def get_object(self): 
      user = self.request.user.id 
      find_user = self.model.objects.get(id=user) 
      return find_user 

class AccountModify(LoginRequiredMixin, 
     AccountCreateOrModify, 
     UpdateView): 

    def dispatch(self, request, 
      *args, **kwargs): 
     try: 
      pk = self.request.user.pk 
      queryset = self.model.objects.get(user_assigned=pk) 
      return super(AccountModify, 
        self).dispatch(request, 
          *args, **kwargs) 
     except Employee.DoesNotExist: 
      return redirect('account_add') 

    def get_object(self, queryset=None): 
     pk = self.request.user.pk 
     queryset = self.model.objects.get(user_assigned=pk) 
     return queryset 





class AccountCreateRecord(LoginRequiredMixin, 
     AccountCreateOrModify, 
     CreateView): 
    print "filler" 
+1

有關性能,代碼完整性,最佳實踐等問題應在http://codereview.stackexchange.com/上發佈。 – Drewness

+0

那邊呢,'Employee'是否延伸'User'?有沒有FK關係?我只是想知道這是否可以用Django的'get_or_create'方法簡化。 – Drewness

+0

這可能更適合代碼審查。如果用戶沒有登錄,會發生什麼情況?即沒有'request.user.pk'或'self.request.user.id'?如果需要登錄,django提供裝飾器以要求登錄 – dm03514

回答

1

try塊應該包含一條線:

def dispatch(self, request, *args, **kwargs): 
    pk = self.request.user.pk 
    try: 
     queryset = self.model.objects.get(user_assigned=pk) 
    except Employee.DoesNotExist: 
     return redirect('account_add') 
    return super(ViewEmployee, self).dispatch(
     request, *args, **kwargs) 

如果只是不返回任何東西,找tryexceptelse塊繼承。

類應該從對象繼承或沒有括號:

class AccountCreateOrModify(object): # a bit better 
    pass 

class AccountCreateOrModify: # avoid useless parenthesis 
    pass 

如果員工是一個抽象類,你能避免打數據庫。

def get_object(self): 
    user = self.request.user.id 
    find_user = self.model.objects.get(id=user) 
    return find_user 

爲什麼在最後一堂課「打印」,你知道關於pass(no-op)關鍵字嗎?

class AccountCreateRecord(LoginRequiredMixin, AccountCreateOrModify, 
          CreateView): 
    pass