Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django TypeError 'QueryDict' object is not callable

I've looked for posts that have endured the same problem that I'm currently facing. But I haven't found a solution. What my problem is:

I have a list of tags. Generated by {% for tag in all_tags %}. Each tag has a tagstatus form. When a user selects an option from a drop down, the form submits and is supposed to save the TagStatus object (Tags are foreignKey'd to TagStatus). However, what returns is this:

Exception Type: TypeError
Exception Value: 'QueryDict' object is not callable

html:

<form class="nice" id="status-form" method="POST" action="">
     {% csrf_token %}
     <input type="hidden" name="status_check" />
     <input type='hidden' name="tag" value="{{ tag }}" />
     <select name="select" id="positionSelect" class="input-text category" onchange="this.form.submit()">
          <option name="all" value="0">Your Status</option>
          <option name="investing" value="1">Status 1</option>
          <option name="selling" value="2">Status 2</option>
          <option name="interested" value="3">Status 3</option>
     </select>
</form>

views.py:

@login_required
def tags(request):
    all_tags = Tag.objects.all()
    context = base_context(request)
    if request.method == 'POST':
        if 'status_check' in request.POST:
            status = request.GET('status')
            tag = request.GET('tag')
            user = request.user
            tag_status, created = TagStatus.objects.get_or_create(status=len(status), tag=tag, user=user).save()

            response = simplejson.dumps({"status": "Successfully changed status"})
        else:
            response = simplejson.dumps({"status": "Error"})
            return HttpResponse (response, mimetype='application/json')
    context['all_tags'] = all_tags
    return render_to_response('tags/tag.html', context, context_instance=RequestContext(request))

models.py (if its relevant):

class TagStatus(models.Model):
    user = models.ForeignKey(User, null=True, unique=True)
    status = models.CharField(max_length=2, choices=tag_statuses)
    tag = models.ForeignKey(Tag, null=True, blank=True)

    def __unicode__(self):
        return self.status

    def save(self, *args, **kwargs):
        super(TagStatus, self).save(*args, **kwargs)

From what I gather it has something to do with the status not being a number. But when I convert it to a int. I get the same error. Please help me. Why is this happening? And whats the fix? I'm not quite sure how to solve this problem. Thank you for your help in advance.

like image 215
Modelesq Avatar asked Nov 26 '22 21:11

Modelesq


2 Answers

I believe the error you're encountering is in these lines:

status = request.GET('status')
tag = request.GET('tag')

request.GET is a QueryDict, and adding () after it attempts to "call" a non-callable object. It appears the syntax you're looking for is dictionary lookup syntax instead:

status = request.GET['status']
tag = request.GET['tag']
like image 178
Jeffrey Froman Avatar answered Nov 29 '22 12:11

Jeffrey Froman


or just call GETs get to get your values

status = request.GET.get('status')
tag = request.GET.get('tag')
like image 32
f-re Avatar answered Nov 29 '22 12:11

f-re