2014-10-10 2 views
0

장고 앱을 만들면 사용자가 계정을 만들고 각 계정에 거래를 추가 할 수 있습니다. 사용자가 투자 이익을 추적 할 수있는 사이트의 일부입니다. 이를 달성하기 위해 제네릭 클래스 뷰를 사용하고 있습니다.장고 일반보기에 대한 액세스 제한

사용자는 트랜잭션을 특정 계정 (코드는 표시되지 않음)에 추가 한 다음 site/transactions/2 /를 사용하여 특정 계정에 대한 트랜잭션을 볼 수 있어야합니다. 여기서 2는 계정 ID입니다.

문제는 로그인 한 사용자가 다른 사용자의 계정 트랜잭션을 가져 오기 위해 URL을 변경할 수 있다는 것입니다. 주어진 계정 ID가 사용자에게 속하는지 확인하여 쉽게 수정할 수 있지만 더 나은 방법이 있어야한다고 생각합니다. 내가 이것을 성취 할 수있는 더 좋은 방법이 있습니까? URL 인코딩하지 않을까요? 나는 어쨌든 DB에 자신의 계정 ID를 보는 사용자의 생각을 좋아하지 않습니다.

또한 나중에 사용자가 일부 계정의 거래를 단일 목록에서 볼 수 있도록하고 싶습니다. 예를 들어 5 개의 계정 중 3 개의 거래를 모두 표시합니다. 그렇다면이 URL 메서드는 실제로 작동하지 않습니다. 여기에 어떤 다른 옵션이 있습니까? views.py에서

url(r'^(?P<account_id>\d+)/$', views.IndexView.as_view(), name='index'), 

:

class Account(models.Model): 
    name = models.CharField(max_length=40, unique=True, db_index=True) 
    user = models.ForeignKey(User) 

class Transaction(models.Model): 
    value = models.DecimalField(max_digits=15, decimal_places=2) 
    date = models.DateField('transaction date') 
    account = models.ForeignKey(Account) 

urls.py에서 : models.py에서

내가 가진

class IndexView(LoginRequiredMixin, generic.ListView): 
    model = Transaction 

    def get_queryset(self): 
     account_id = self.kwargs['account_id'] 
     queryset = Transaction.objects.filter(account_id=account_id) 
     return queryset 

을 그리고 나는 transaction_list 템플릿을

감사합니다.

답변

1

404 오류가 발생하면 도우미 기능 get_object_or_404()을 사용하여 먼저 계정 개체를 가져올 수 있습니다. 이처럼

:

def get_queryset(self): 
    account_id = self.kwargs['account_id'] 

    # raise 404 if no account is found for the current user 
    account = get_object_or_404(Account, pk=account_id, user=self.request.user) 

    queryset = Transaction.objects.filter(account=account) 
    return queryset 

당신이, 당신이 새로운보기를 만들거나 'account_id' URL에 있었다면 바로 확인하고, 현재보기를 다시 사용할 수 중 하나를 언급 한 두 번째 일하십시오. 새로운 URL이 필요합니다.

urls.py : 더 계정 ID가 URL에없는 경우

url(r'^(?P<account_id>\d+)/$', views.IndexView.as_view(), name='index'), 
url(r'^$', views.IndexView.as_view(), name='index'), 

이 경우에 다시 get_queryset()을 수정

def get_queryset(self): 
    # account_id will be None if the second url was the one that matched. 
    account_id = self.kwargs.get('account_id', None) 

    if account_id: 
     # raise 404 if no account is found for the current user 
     account = get_object_or_404(Account, pk=account_id, user=self.request.user) 

     queryset = Transaction.objects.filter(account=account) 
    else: 
     # we're going to show all transactions for the user, rather than a specific account 
     queryset = Transaction.objects.filter(account__user=self.request.user) 

    return queryset 
+0

정말 고마워요! 나는 그것이 그것을해야한다고 생각한다. 나는 장고에 대해 아주 익숙하다. 그래서이 예제와 같이 URL에 데이터베이스 필드 ID를 갖는 것이 좋은가? – Johan

+0

꽤 표준입니다. 더 좋고 더 친숙한 방법은 슬러그를 대신 사용하는 것입니다. 하지만 이드를 사용하는 것은 나쁜 습관이라고 생각하지 않습니다. – jproffitt