0

За последние 2 часа я пытался выполнить следующее в Django 1.5: Я хочу получить записи из моей базы данных на основе электронной почты пользователя, которая хранится в сеансе. Вот мои идеальные алгоритмы:Использование ClassBasedViews Я хочу получить записи из моей базы данных в Django на основе электронной почты пользователя, которая хранится в сеансе

In my function based view: 
1. Attempt Login 
2. If account exists, log user in and save email in request.session['email'] 

In my DetailView: 
1.Get the email from the session and save it to a variable; email. 
2. Create a queryset to retrieve the account filtering by email 

Я реферирован docs и post по этому вопросу, но не могу получить мою голову вокруг него. Я решил использовать метод get для извлечения сеанса, и он работает ... Единственная проблема заключается в том, что я не уверен, как я могу получить доступ к переменной, возвращаемой этим методом. Я посмотрел на this answer, но не счел это слишком полезным. Если этот вопрос существует, то еще, где я хочу его, чтобы удалить его. Благодаря!

 


#views.py CBV snippet 
class AccountDetailView(DetailView): 
    model = Account 
    template_name = 'accounts/view_account.html' 
    queryset = Account.objects.filter(verified=1) 
    slug_field = 'username' 
    slug_url_kwarg = 'username' 

    def get(self, request, *args, **kwargs): 
     email = request.session['email'] 
     #just to make sure we've accessed the session...print to screen 
     return HttpResponse(email) 

#views.py FBV snippet 
def AccountLogin(request): 
    template_name = 'accounts/login.html' 
    if request.method == 'POST': 
     form = AccountLoginForm(request.POST) 
     if form.is_valid() and form is not None: 
      clean = form.cleaned_data 
      try: 
       #only allow login for verified accounts 
       account = Account.objects.get(email=clean['email']) 
       if account and account is not None and account.verified == 1: 
        #if account exist log user in 
        user = authenticate(username=clean['email'], password=clean['password']) 
        #we'll user this later to pull their account info 
        request.session['email'] = account.email 
        #logs user in 
        login(request, user) 

 

Это решение в представлении, основанном на функции ... как реализовать его в представлении на основе классов - это то, о чем я прошу.

 

def AccountView(request): 
    account = Account.objects.get(verified=1, email=request.session['email']) 
    return render(request, 'accounts/view_account.html', {'account': account}) 
 
+0

Я оставлю это здесь, если у кого-то есть аналогичный вопрос ... Я закончил с CBV, я просто буду придерживаться FBV. – Staccato

ответ

0

Вы делаете это серьезно неправильно, и проблема в том, что я не могу сказать, что вы пытаетесь выполнить. Представления на основе классов чрезвычайно просты и понятны, и почти никогда не нужно переоценивать методы get ˙ и post.

Почему вы храните электронное письмо в сеансе, так как его легко получить из аутентифицированного пользователя?

Даже в вашем FBV вы делаете много ненужных действий; логин лучше всего оставлять на отдельном представлении, перенаправляя пользователя в правильное представление после аутентификации.

+0

Проблема, с которой я столкнулся, заключалась в том, что она извлекала все учетные записи, а не только учетную запись зарегистрированного пользователя. Чтобы исправить проблему, я решил использовать фильтр (Accounts.objects.filter (email = user's_email)), но для использования фильтра мне нужна была переменная электронной почты, и я не был уверен, как я могу получить доступ к переменной электронной почты, не помещая ее в URL-адресе, поэтому я решил сохранить его в сеансе и использовать значение в сеансе для запуска моего запроса. Что касается получения электронной почты от аутентифицированного пользователя, как мне это сделать? Я знаю, что логин() сохраняет идентификатор пользователя в сеансе, как мне получить доступ к нему на мой взгляд? – Staccato

+0

В представлении, основанном на классе, зарегистрированный пользователь доступен как 'self.request.user'. –

+0

Кроме того, 'DetailView' ожидает в URLConf параметр' pk' или 'slug'; в этом случае вам, вероятно, лучше просто использовать «TemplateView», так как нет необходимости в дополнительной фильтрации. –

-1

Я нашел ответ, который искал в этой теме Django - Access session in urls.py Я определенно «передумал», и я также понятия не имел, как получить доступ к self.request.user. Даже когда я набрал это решение в редакторе PyCharm, я получил предупреждение о недоступности request, возможно, потому что это динамическое значение ... ниже - мое окончательное решение.

#views.py 
class AccountRead(ListView): 
context_object_name = 'account' 
template_name = 'accounts/view_account.html' 

def get_queryset(self): 
    return Account.objects.filter(pk=self.request.user.id) 

 Смежные вопросы

  • Нет связанных вопросов^_^