python - Django 1.8 AttributeError: 'dict' object has no attribute 'push' -
here traceback:
environment: request method: 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 @ /myapp/addinterest/ exception value: 'dict' object has no attribute 'push'
here's 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 form instance , populate data 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 new interest:", max_length=100)`
template:
<div class="container"> <h1>add interests</h1> </div> <!-- /container --> <div class="container"> list: <ul>{% 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 django, i'm assuming simple fix couldn't find other questions 'dict' object has no attribute 'push'.
my interest field part of user profile model. interest field listview i've seen used lot of times on here.
class listfield(models.textfield): __metaclass__ = models.subfieldbase description = "stores 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 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 userprofile model, here add , remove interest. doubt reason of issue, in case, here 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 render_to_response()
arguments mixed up:
return render_to_response('add_interests.html', context, {'form': form})
the documentation tells second argument dictionary, 3rd context instance, swapped them.
best use context_instance
argument keyword argument:
return render_to_response('add_interests.html', {'form': form}, context_instance=context)
Comments
Post a Comment