Reputation: 525
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
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
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