Django 1.8 AttributeError:'dict'对象没有属性'push' [英] Django 1.8 AttributeError: 'dict' object has no attribute 'push'

查看:143
本文介绍了Django 1.8 AttributeError:'dict'对象没有属性'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屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆