frfahim
frfahim

Reputation: 525

Why show this Error 'function' object has no attribute 'as_view'

I want to update my user profile data.But when run got this error 'function' object has no attribute 'as_view'.

I am using Django 1.8, python 2.7

I am new in Django.

urls.py code :

from django.conf.urls import include, url
from . import views
urlpatterns = [

url(r'^(?P<pk>\d+)/$',
    views.UserProfileDetail.as_view(),
    name='user_profile_detail'),
url(r'^(?P<pk>\d+)/update/$',
    views.UserProfileUpdate.as_view(),
    name='user_profile_edit'),
]

views.py:

from django.shortcuts import render
from blog.models import Post, UserProfile
from blog.forms import UserForm, UserProfileForm, PostForm
from django.contrib.auth.models import User
from django.views.generic import DetailView
from django.views.generic import CreateView, UpdateView
from .models import UserProfile

class UserProfileDetail(DetailView):
    model = UserProfile

@login_required
class UserProfileUpdate(UpdateView):
    model = UserProfile
    fields = ('name', 'website',)

    def get(self, request, *args, **kwargs):
        UserProfile(kwargs['pk'])
        return (super(UserProfileUpdate, self).
                get(self, request, *args, **kwargs))

models.py

from django.db import models
from django.contrib.auth.models import User

class UserProfile(models.Model):
    user = models.OneToOneField(User)

    name = models.CharField(max_length=30)
    website = models.URLField(blank=True)

    def __unicode__(self):
        return self.user.username

html:

{% extends 'blog/base.html' %}
{% block content %}
<h2>Edit {{ object.user.username }} Profile</h2>
<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Update" />
</form>
{% endblock %}

Upvotes: 1

Views: 2292

Answers (2)

Bryan Kimani
Bryan Kimani

Reputation: 921

You can't use the login_required decorator on a class like that. You need to use method_decorator. On Django 1.9+, you can decorate the class:

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

@method_decorator(login_required, name='dispatch')
class UserProfileUpdate(UpdateView):
    model = UserProfile
   fields = ('name', 'website',)

Also check here Django/python: 'function' object has no attribute 'as_view' @Alasdair gave an example and explanation

Upvotes: 2

iago1460
iago1460

Reputation: 1004

Your UserProfileUpdate view should look like:

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


class UserProfileUpdate(UpdateView):
    model = UserProfile
    fields = ('name', 'website',)

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

Upvotes: 1

Related Questions