Django 1.8 AttributeError:'dict'对象没有属性'push' [英] Django 1.8 AttributeError: 'dict' object has no attribute 'push'
问题描述
这是追溯:
环境:
请求方法:GET
请求URL:http://127.0.0.1:8000/myapp/addinterest/
Django版本:1.8.2
Python版本:2.7.8
已安装应用程序:
('django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions' ,
'django.contrib.messages',
'django.contrib.staticfiles',
'myapp')
安装的中间件:
('django.contrib。 session.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware' ,
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware .security.SecurityMiddleware')
追溯:
文件/Library/Python/2.7/site-packages/django/core/handlers/base.pyin get_response
132.在_wrapped_view $中的`response = wrapped_callback(request,* callback_args,** callback_kwargs)`
文件/Library/Python/2.7/site-packages/django/contrib/auth/decorators.py b $ b 22.`return view_func(request,* args,** kwargs)`
文件/~/myapp/views.pyin add_interest
155.`return render_to_response('add_interests.html ',context,{'form':form})`
文件/Library/Python/2.7/site-packages/django/shortcuts.py在render_to_response
45.`using = using)`
文件/Library/Python/2.7/site-packages/django/template/loader.py在render_to_string
116.`template_name,context,context_instance,dirs,dictionary)`
文件/Library/Python/2.7/site-packages/django/template/engine.py在render_to_string
220中。 `with context_instance.push(context):`
异常类型:/ myapp / addinterest /
中的AttributeError异常值:'dict'对象没有属性'push'
这是我的代码:
网址: url(r'^ addinterest / $',views.add_interest,name ='add_interest'),
查看:
@login_required
def add_interest(request):
context = RequestContext(request)
如果request.method =='POST':
#create一个表单实例,并使用来自请求的数据
form = InterestForm(request.POST)
如果form.is_valid():
#process data in form.clean_data
interest = form.cleaned_data ['interest']
user.add_interest(兴趣)
返回HttpResponseRedirect('add_interests.html',上下文)
else:
form = InterestForm()
返回render_to_r请求('add_interests.html',上下文,{'form':form})
/ p>
class InterestForm(forms.Form):
interest = forms.CharField(label =输入新兴趣: ,max_length = 100)`
模板:
< pre class =lang-html prettyprint-override>
< div class =container>
< h1>添加兴趣< / h1>
< / div> <! - / container - >
< div class =container>
这是你的列表:
< ul> {%for i in user.profile.interests%}
< li> {{i}}< button type =button >删除兴趣< / button>
{%endfor%}< / ul>
< / div> <! - / container - >
< div class =container>
< form action ={%url add_interest%}method =POST>
{%csrf_token%}
{{form}}
< input type =submitvalue =添加兴趣/>
< / form>
< / div>
我刚刚到Django,所以我假设这是一个非常简单的修复,但我couldn 'dict'对象找不到任何其他问题没有属性'push'。
我的兴趣领域是用户配置文件模型的一部分。兴趣领域是ListView,我已经看到在这里使用了很多次。
class ListField(models.TextField) :
__metaclass__ = models.SubfieldBase
description =存储一个python列表
def __init __(self,* args,** kwargs):
super(ListField ,self).__ init __(* args,** kwargs)
def to_python(self,value):
如果不是值:
value = []
如果isinstance(value,list):
返回值
返回ast.literal_eval(value)
def get_prep_value(self,value):
如果值为无:
返回值
返回unicode(值)
def value_to_string(self,obj):
value = self。 _get_val_from_obj(obj)
return self.get_db_prep_value(value)
在我的UserProfile模型中,是添加和删除兴趣。我怀疑这是问题的原因,但是为了防止这些功能。
class UserProfile(models.Model )
interest = ListField(blank = True)
def add_interest(self,value):
self.interests。 insert(len(self.interests)+1,value)
#self.save()
def remove_interest(self,value):
self.interests.remove(value)
#self.save()
code> render_to_response()参数混合:
return render_to_response('add_interests.html ',context,{'form':form})
文档告诉你第二个参数是一个字典,第三个是上下文实例,但是你换了他们。
最好使用 contex t_instance
参数作为关键字参数:
返回render_to_response('add_interests.html',{'form ':form},context_instance = context)
Here is the traceback:
Environment:
Request Method: GET
Request URL: http://127.0.0.1:8000/myapp/addinterest/
Django Version: 1.8.2
Python Version: 2.7.8
Installed Applications:
('django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'myapp')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.security.SecurityMiddleware')
Traceback:
File "/Library/Python/2.7/site-packages/django/core/handlers/base.py" in get_response
132. `response = wrapped_callback(request, *callback_args, **callback_kwargs)`
File "/Library/Python/2.7/site-packages/django/contrib/auth/decorators.py" in _wrapped_view
22. `return view_func(request, *args, **kwargs)`
File "/~/myapp/views.py" in add_interest
155. `return render_to_response('add_interests.html', context, {'form': form})`
File "/Library/Python/2.7/site-packages/django/shortcuts.py" in render_to_response
45. `using=using)`
File "/Library/Python/2.7/site-packages/django/template/loader.py" in render_to_string
116. `template_name, context, context_instance, dirs, dictionary)`
File "/Library/Python/2.7/site-packages/django/template/engine.py" in render_to_string
220. `with context_instance.push(context):`
Exception Type: AttributeError at /myapp/addinterest/
Exception Value: 'dict' object has no attribute 'push'
Here's my code:
Url:url(r'^addinterest/$', views.add_interest, name='add_interest'),
View:
@login_required
def add_interest(request):
context = RequestContext(request)
if request.method == 'POST':
#create a form instance and populate it with data from the request
form = InterestForm(request.POST)
if form.is_valid():
#process data in form.clean_data
interest = form.cleaned_data['interest']
user.add_interest(interest)
return HttpResponseRedirect('add_interests.html', context)
else:
form=InterestForm()
return render_to_response('add_interests.html', context, {'form': form})
Form:
class InterestForm(forms.Form):
interest = forms.CharField(label="Enter a new Interest:", max_length=100)`
Template:
<div class="container">
<h1>Add Interests</h1>
</div> <!-- /container -->
<div class="container">
This is your list:
<ul>{% for i in user.profile.interests %}
<li>{{i}} <button type="button">Remove Interest</button>
{% endfor %}</ul>
</div> <!-- /container -->
<div class ="container">
<form action="{% url add_interest %}" method="POST">
{% csrf_token %}
{{ form }}
<input type="submit" value="Add Interest" />
</form>
</div>
I'm new to Django, so I'm assuming this is a very simple fix but I couldn't find any other questions with 'dict' object has no attribute 'push'.
My interest field is part of a user profile model. The interest field is a ListView which I've seen used a lot of times on here.
class ListField(models.TextField):
__metaclass__ = models.SubfieldBase
description = "Stores a python list"
def __init__(self, *args, **kwargs):
super(ListField, self).__init__(*args, **kwargs)
def to_python(self, value):
if not value:
value = []
if isinstance(value, list):
return value
return ast.literal_eval(value)
def get_prep_value(self, value):
if value is None:
return value
return unicode(value)
def value_to_string(self, obj):
value = self._get_val_from_obj(obj)
return self.get_db_prep_value(value)
In my UserProfile model, here are the add and remove interest. I doubt this is the reason of the issue, but just in case, here are the functions.
class UserProfile(models.Model):
interests = ListField(blank=True)
def add_interest(self, value):
self.interests.insert(len(self.interests)+1, value)
#self.save()
def remove_interest(self, value):
self.interests.remove(value)
#self.save()
You got your render_to_response()
arguments mixed up:
return render_to_response('add_interests.html', context, {'form': form})
The documentation tells you the second argument is a dictionary, the 3rd the context instance, but you swapped them.
Best use the context_instance
argument as a keyword argument:
return render_to_response('add_interests.html', {'form': form}, context_instance=context)
这篇关于Django 1.8 AttributeError:'dict'对象没有属性'push'的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!