1
votes

when i try to create a post, it will show me this error

Exception Type: AttributeError at /home/
Exception Value: 'HomeView' object has no attribute 'user'

and my view.py is

class HomeView(TemplateView):
    template_name = 'home/home.html'

    def get(self, request):
        form = HomeForm()
        posts = Post.objects.all().order_by('-created')
        users = User.objects.exclude(id=request.user.id)
        friend = Friend.objects.get(current_user=request.user)
        friends = friend.users.all()

        args = {
            'form': form, 'posts': posts, 'users': users, 'friends': friends
        }
        return render(request, self.template_name, args)

    @login_required
    def post(self, request):
        if request.method == 'POST':
            form = HomeForm(request.POST or None, request.FILES or None)
            if form.is_valid():
                post = form.save(commit=False)
                post.user = request.user
                post.save()
                return redirect('home:home')
            else:
                return redirect(reverse('home:home'))
        else:
            form = HomeForm()
            args = {'form': form}
            return render(request, self.template_name, args)

Traceback:

File "/home/zola/lib/python3.5/site-packages/django/core/handlers/exception.py" in inner 39. response = get_response(request)

File "/home/zola/lib/python3.5/site-packages/django/core/handlers/base.py" in _get_response 187. response = self.process_exception_by_middleware(e, request)

File "/home/zola/lib/python3.5/site-packages/django/core/handlers/base.py" in _get_response 185. response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/home/zola/lib/python3.5/site-packages/django/views/generic/base.py" in view 68. return self.dispatch(request, *args, **kwargs)

File "/home/zola/lib/python3.5/site-packages/django/views/generic/base.py" in dispatch 88. return handler(request, *args, **kwargs)

File "/home/zola/lib/python3.5/site-packages/django/contrib/auth/decorators.py" in _wrapped_view 22. if test_func(request.user):

please help

I've been missing for a long time. using this language. then help me with this error

1
which line is causing the issue? - Ashish Acharya
Can you add urls.py and full traceback? - neverwalkaloner
post.user=request.user - Osman Hamashool
Does your Post model have a user attribute? - Dalvtor
I don't think the part of the code that has the error is included here. Please include the full code and the full traceback. - Ashish Acharya

1 Answers

8
votes

Instead of using @login_required decorator, use @method_decorator(login_required) on your post method, like so:

from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator

class HomeView(TemplateView):
    # ...
    @method_decorator(login_required)
    def post(self, request):
        # ...

The reason why you're seeing an error message is because login_required is a function decorator - so it expects the request object to be the first argument passed to your view. Your post definition is a method, therefore self (HomeView) is the first argument that's getting passed, and this is what login_required tries to use as a Request instance.

method_decorator is used to transform every function decorator to a method decorator. See the docs for more info.