簡體   English   中英

Django: NameError User_id is not defined試圖查詢用戶的帳戶頁面

[英]Django: NameError User_id is not defined attempting to query user's account page

刪除“博客文章”后,我想返回帳戶頁面,即帳戶:視圖。

但是我遇到了以下錯誤,告訴我未定義 user_id。 這是一個 NameError,如回溯中所示。

我嘗試在account = Account.objects.get(pk=user_id) user_id = kwargs.get("user_id") ,就像我在 accounts.views.py 中所做的那樣,但它最終返回了另一個錯誤。

有人可以建議我應該如何在這個視圖中定義 user_id,也許我應該如何在其他視圖中定義帳戶,以便我正確返回到用戶的帳戶頁面。 非常感謝!

追溯:

Traceback (most recent call last):
  File "/lib/python3.8/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "lib/python3.8/site-packages/django/core/handlers/base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/lib/python3.8/site-packages/django/core/handlers/base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/lib/python3.8/site-packages/django/contrib/auth/decorators.py", line 21, in _wrapped_view
    return view_func(request, *args, **kwargs)
  File "HomeFeed/views.py", line 147, in delete_blog_view
    account = Account.objects.get(pk=user_id)
NameError: name 'user_id' is not defined

在 HomeFeed 應用程序中: urls.py

app_name = 'HomeFeed'

    path('<slug>/delete/', delete_blog_view, name= "delete"),

視圖.py

@login_required
def delete_blog_view(request,slug):
    context = {}

    user = request.user
    #YOU WANT to check if user is authenticated. if not, you need to authenticate! redirect you to that page
    if not user.is_authenticated:
        return redirect("must_authenticate")
 #querying the accounts from the Account model table   
    account = Account.objects.get(pk=user_id)
#querying the blog post to be deleted by referencing to the slug
    blog_post = get_object_or_404(BlogPost, slug=slug)
#deleting the blog post
    blog_post.delete()
#return redirect to the account:view page after the delete
    return redirect(request.META.get('HTTP_REFERER', 'account:view', kwargs={'user_id': account.pk }))

在“帳戶”應用程序中:

網址.py:

    path('<user_id>/', account_view, name="view"),

視圖.py

def account_view(request, *args, **kwargs):
 context = {}
 user_id = kwargs.get("user_id")
 try:
  account = Account.objects.get(pk=user_id)
 except:
  return HttpResponse("Something went wrong.")
 if account:
  context['id'] = account.id
  context['username'] = account.username
  context['email'] = account.email
  context['profile_image'] = account.profile_image.url
  context['BASE_URL'] = settings.BASE_URL

 return render(request, "account/account.html", context)

模型.py:

class Account(AbstractBaseUser):
 email                  = models.EmailField(verbose_name="email", max_length=60, unique=True)
 username               = models.CharField(max_length=30, unique=True)

 USERNAME_FIELD = 'email'
 REQUIRED_FIELDS = ['username']


 def __str__(self):
  return self.username


get() 錯誤的回溯:

Traceback (most recent call last):
  File "/lib/python3.8/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "lib/python3.8/site-packages/django/core/handlers/base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "lib/python3.8/site-packages/django/core/handlers/base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "lib/python3.8/site-packages/django/contrib/auth/decorators.py", line 21, in _wrapped_view
    return view_func(request, *args, **kwargs)
  File "HomeFeed/views.py", line 151, in delete_blog_view
    return redirect(request.META.get('HTTP_REFERER', 'account:view', kwargs={'user_id': account.pk }))
TypeError: get() takes no keyword arguments

編輯代碼:

def delete_blog_view(request,slug):
    context = {}
    user_id = request.user.id   
    account = Account.objects.get(pk=user_id)
    #account = Account.objects.get(pk=user_id)
    blog_post = get_object_or_404(BlogPost, slug=slug)
    blog_post.delete()
    if request.META.get('HTTP_REFERER') == reverse("HomeFeed:main"):
        return redirect(reverse("HomeFeed:main"))
    elif request.META.get('HTTP_REFERER') == reverse("HomeFeed:detail", kwargs={'slug': slug }):        
        return redirect(reverse( 'account:view', kwargs={'user_id': request.user.id }))
    else:   
        return redirect(reverse('HomeFeed:main'))
    print(request.META("HTTP_REFERER"))

    


關於您的解決方案出了什么問題,這里有一個很好的答案 - django:django.utils.functional.SimpleLazyObject 的目的?

簡而言之,這是因為當您調用delete_blog_view(request,slug): function 時,您沒有以授權用戶身份登錄,因此request.user解析為SimpleLazyObject

只需確保當您調用此 function 時,用戶已通過身份驗證。

一個瘋狂的猜測:您是否也可以嘗試將其設置為request.user.id並查看是否有效?

如果沒有任何效果,您能否准確描述您如何調用delete_blog_view()方法以幫助我更好地理解。

要獲取用戶的id

帳戶/views.py

@login_required
def delete_blog_view(request,slug):

    user = request.user
    user_id=user.id
    #This is redundant as you have the login_required decorator
    #if not user.is_authenticated:
            #return redirect("must_authenticate")

    account = Account.objects.get(pk=user_id)

    blog_post = get_object_or_404(BlogPost, slug=slug)

    blog_post.delete()
     
    return redirect(request.META.get('HTTP_REFERER', 'account:view', kwargs={'user_id': account.pk }))

如果您僅將user_id用於重定向,則可以:

帳戶/views.py

from django.urls import reverse
@login_required
def delete_blog_view(request,slug):     

    blog_post = get_object_or_404(BlogPost, slug=slug)

    blog_post.delete()
    ## checks if the  referrer is the home page
    if request.META.get('HTTP_REFERER') == request.build_absolute_uri(reverse("myhomeview")):
        return redirect(reverse("myhomeview")))
    elif    request.META.get('HTTP_REFERER') == request.build_absolute_uri(reverse("mydetailview")):        
        return redirect(reverse( 'account:view', kwargs={'user_id': request.user.id }))
    else:
        ## include your fallback return value. 
        return redirect(reverse("mydesiredview"))

暫無
暫無

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

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