0
votes

In my forum app,I want to show post details with it's author name. In 'new-post' class in views.py I tried to save the author name by post.user = self.request.user But whenever my current login user submits his new post it gives the mentioned error.

views.py:

class NewPost(CreateView):
    form_class = PostForm
    template_name = 'post_form.html'

@login_required
def form_valid(self,form):
    post = form.save(commit=False)
    post.user= self.request.user
    post.save()
    return redirect('website:details', post=post)

forms.py:

class PostForm(forms.ModelForm):

    class Meta:
        model = Post
        fields=('title','description')

Models.py:

class Post(models.Model):
    user =  models.ForeignKey(User, on_delete =models.CASCADE)
    title = models.CharField(max_length = 500, blank = False)
    description = models.TextField()

def __str__(self):
    return self.title

html file:

<div class ="container-fluid">
<form method="post">
    {% csrf_token %}

    {{ form.as_p }}
    <input type="submit" value="Save">
</form>
</div>

AttributeError at /website/add/ <br>
'NewPost' object has no attribute 'user'<br>
Request Method: POST <br>
Request URL:    http://127.0.0.1:8000/website/add/<br>
Django Version: 1.9 <br>
Exception Type: AttributeError <br>
Exception Value:    <br>
'NewPost' object has no attribute 'user' <br>
Exception Location: C:\Python27\lib\site-packages\django-1.9-py2.7.egg\django\contrib\auth\decorators.py in _wrapped_view, line 22 <br>
Python Executable:  C:\Python27\python.exe<br>
Python Version: 2.7.14 <br>
Python Path:    <br>
['C:\\Users\\as_couple\\Desktop\\STUDENTTRACKERSYSTEM',
 'C:\\WINDOWS\\SYSTEM32\\python27.zip',
 'C:\\Python27\\DLLs',<br>
 'C:\\Python27\\lib',<br>
 'C:\\Python27\\lib\\plat-win',<br>
 'C:\\Python27\\lib\\lib-tk',<br>
 'C:\\Python27', <br>
 'C:\\Python27\\lib\\site-packages', <br>
 'C:\\Python27\\lib\\site-packages\\django_admin-1.1.1-py2.7.egg', <br>
 'C:\\Python27\\lib\\site-packages\\django_excel_response2-2.0.8-py2.7.egg',<br>
 'C:\\Python27\\lib\\site-packages\\django_six-1.0.4-py2.7.egg',<br>
 'C:\\Python27\\lib\\site-packages\\django-1.9-py2.7.egg']<br>

Updated file:

Traceback:`File "C:\Python27\lib\site-packages\django-1.9-py2.7.egg\django\core\handlers\base.py" in get_response 149. response = self.process_exception_by_middleware(e, request)

File "C:\Python27\lib\site-packages\django-1.9-py2.7.egg\django\core\handlers\base.py" in get_response 147. response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "C:\Python27\lib\site-packages\django-1.9-py2.7.egg\django\views\generic\base.py" in view 68. return self.dispatch(request, *args, **kwargs)

File "C:\Python27\lib\site-packages\django-1.9-py2.7.egg\django\views\generic\base.py" in dispatch 88. return handler(request, *args, **kwargs)

File "C:\Python27\lib\site-packages\django-1.9-py2.7.egg\django\views\generic\edit.py" in post 255. return super(BaseCreateView, self).post(request, *args, **kwargs)

File "C:\Python27\lib\site-packages\django-1.9-py2.7.egg\django\views\generic\edit.py" in post 221. return self.form_valid(form)

File "C:\Python27\lib\site-packages\django-1.9-py2.7.egg\django\contrib\auth\decorators.py" in _wrapped_view 22. if test_func(request.user):

Exception Type: AttributeError at /website/add/ Exception Value: 'NewPost' object has no attribute 'user'`

2
Are you sure that is your actual code? It seems like you have self.user not self.request.user.Daniel Roseman
Yes. I wrote that at first time. then i changed it to request.user and many other things like post.username = self.request.username but nothing works. t gives me the same error every time.Ahsan Shuvo
It can't give you the same error with different code. Did you restart the server?Daniel Roseman
It has been giving me the same error for few days. During this time, I have restarted the server many times.Ahsan Shuvo
remove @login_required decorator and test it againKhashayar Ghamati

2 Answers

1
votes

I supposed that

class NewPost(CreateView):
    form_class = PostForm
    template_name = 'post_form.html'

@login_required
def form_valid(self,form):
    post = form.save(commit=False)
    post.user= self.request.user
    post.save()
    return redirect('website:details', post=post)

is unindented, and that def form_valid is a method of your class. When using Class Based View you cannot decorate methods directly. Instead, you need to decorate the dispatch, like this

class NewPost(CreateView):
    form_class = PostForm
    template_name = 'post_form.html'

def form_valid(self,form):
    post = form.save(commit=False)
    post.user= self.request.user
    post.save()
    return redirect('website:details', post=post)

@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
    return super(NewPost, self).dispatch(*args, **kwargs)

i.e. the error is not fired in your form_valid, but in the decorator code

-1
votes

Try add user in class Meta. Like fields=('title','description','user')