【问题标题】:Django: NameError User_id is not defined attempting to query user's account pageDjango:尝试查询用户的帐户页面时未定义 NameError User_id
【发布时间】:2021-04-07 22:54:39
【问题描述】:

删除“博客文章”后,我想返回帐户页面,即 account:view。

但是我遇到了以下错误,告诉我未定义 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"),

views.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 }))

在“帐户”应用中:

urls.py:

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

views.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)

models.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"))

    


【问题讨论】:

  • 嗨 mugoma,我使用了你的方法并得到了一个类型错误:int() 参数必须是一个字符串、一个类似字节的对象或一个数字,而不是 'SimpleLazyObject'
  • @Mugoma ^^^^^^^
  • 发布的代码中没有任何地方使用int() 函数。
  • 你可以有user_id = request.user.id
  • 我试过这个并得到一个类型错误:get() 没有关键字参数

标签: python django


【解决方案1】:

获取用户的id

account/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 进行重定向,您可以:

account/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"))

【讨论】:

    【解决方案2】:

    关于您的解决方案出了什么问题,这里有一个很好的答案 - django: Purpose of django.utils.functional.SimpleLazyObject?

    简而言之,这是因为当您调用 delete_blog_view(request,slug): 函数时,您并未以授权用户身份登录,因此 request.user 解析为 SimpleLazyObject

    只需确保在调用此函数时用户已通过身份验证。

    一个大胆的猜测:你也可以尝试将它设置为request.user.id 看看是否有效?

    如果没有任何效果,您能否准确描述您是如何调用delete_blog_view() 方法以帮助我更好地理解的。

    【讨论】:

    • 感谢您的输入,我已经用 cmets 编辑了我的代码来解释每一行的含义。我相信问题可能是因为我已经在上一行中调用了用户。目前我仍然面临这个问题:我收到一个名称错误,说 user_id is not defined
    • 我不能做 user = request.user.id 因为之前我已经调用了 user = request.user
    • 我也不能做 user_id = request.user.id 因为我会得到一个类型错误:get() 没有关键字参数
    • @timago 我会检查并告诉你
    • 非常感谢,上帝保佑你!新年快乐
    猜你喜欢
    • 2018-02-14
    • 1970-01-01
    • 1970-01-01
    • 2016-11-21
    • 2018-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-23
    相关资源
    最近更新 更多