views:

305

answers:

1

Hey, I've been doing some changes to my django develpment env, as some of you suggested. So far I've managed to configure and run it successfully with postgres.

Now I'm trying to run the app using apache2 and mod_wsgi, but I ran into this little problem after I followed the guidelines from the django docs.

When I access localhost/myapp/tasks this error raises:

    Request Method:   GET
Request URL:  http://localhost/myapp/tasks/
Exception Type:  TemplateSyntaxError
Exception Value:  

Caught an exception while rendering: argument 1 must be a string or unicode object

Original Traceback (most recent call last):
  File "/usr/local/lib/python2.6/dist-packages/django/template/debug.py", line 71, in render_node
    result = node.render(context)
  File "/usr/local/lib/python2.6/dist-packages/django/template/defaulttags.py", line 126, in render
    len_values = len(values)
  File "/usr/local/lib/python2.6/dist-packages/django/db/models/query.py", line 81, in __len__
    self._result_cache = list(self.iterator())
  File "/usr/local/lib/python2.6/dist-packages/django/db/models/query.py", line 238, in iterator
    for row in self.query.results_iter():
  File "/usr/local/lib/python2.6/dist-packages/django/db/models/sql/query.py", line 287, in results_iter
    for rows in self.execute_sql(MULTI):
  File "/usr/local/lib/python2.6/dist-packages/django/db/models/sql/query.py", line 2369, in execute_sql
    cursor.execute(sql, params)
  File "/usr/local/lib/python2.6/dist-packages/django/db/backends/util.py", line 19, in execute
    return self.cursor.execute(sql, params)
TypeError: argument 1 must be a string or unicode object
... ... ...

And then it highlights a {% for t in tasks %} template tag, like the source of the problem is there, but it worked fine on the built-in server.

The view associated with that page is really simple, just fetch all Task objects. And the template just displays them on a table.

Also, some pages get rendered ok. Don't want to fill this Question with code, so if you need some more info I'd be glad to provide it. Thanks

EDIT

So, here is my view:

@login_required
def tasks(request, msg=''):
    tasks = Task.objects.all()
    message = msg
    return custom_render('user/tasks.html',
                         {'tasks': tasks, 'message':message},
                         request)

And here is my template:

{% block main_content %}

{% if message %}
    <p id="message" class="info">
        {{message}}
    </p>
{% endif %}

<a href="{% url GProject.myapp.views.new_task %}">Nueva Tarea</a>

    <table  id="tasks-table" >
        <thead>
            <tr>
                <th colspan="4" >{{tasks|length}} tareas pendientes</th>
            </tr>
            <tr>
                <th>#</th>
                <th>Proyecto</th>
                <th>Título</th>
                <th>Estado</th>
            </tr>
        </thead>
        <tbody>
            {% for t in tasks %}
                <tr id="row-{{t.id}}" class="{% cycle 'row-0' 'row-1' %} priority-{{ t.priority }}">
                    <td width="25">
                       <a href="{% url GProject.myapp.views.view_task t.id %}">{{t.id}}</a>
                   </td>
                   <td>
                       <a href="{% url GProject.myapp.views.view_task t.id %}">{{t.project}}</a>
                   </td>
                   <td width="400">
                       <a href="{% url GProject.myapp.views.view_task t.id %}">
                           {{t.title}}
                       </a>
                   </td>
                   <td>{{t.get_status_display}}</td>
                </tr>
            {% empty %}
                <tr><td>No tasks</td></tr>
            {% endfor %}

        </tbody>
    </table>
{% endblock main_content %}

Also, now I'm getting this error:

TypeError at /admin/tareas/

argument 1 must be a string or unicode object

Request Method:  GET
Request URL:  http://localhost/gpro/admin/tareas/
Exception Type:  TypeError
Exception Value:  

argument 1 must be a string or unicode object

Exception Location:  /usr/local/lib/python2.6/dist-packages/django/db/backends/postgresql_psycopg2/base.py in _cursor, line 105
Python Executable:  /usr/bin/python
Python Version:  2.5.4

EDIT

Tasks model looks like this:

class Task(models.Model):

    project = models.ForeignKey(Project)
    title = models.CharField(max_length=128)
    description = models.TextField(max_length=1500)
    effort = models.IntegerField(null=True, blank=True)
    priority = models.IntegerField(max_length=1, null=True, blank=True, choices=PRIORITY_VALUES)
    severity = models.IntegerField(max_length=1, null=True, blank=True, choices=SEVERITY_VALUES)
    asignee = models.ForeignKey(User, blank=True, null=True, related_name='asignee')
    milestone = models.ForeignKey(Milestone, blank=True, null=True)
    created_by = models.ForeignKey(User, blank=True, null=True, related_name='created_by')
    status = models.IntegerField(max_length=1, choices=STATUS_VALUES, default=1)
    resolution_comment = models.CharField(max_length=1500, null=True, blank=True) #comentario al resolver la task
    due_date = models.DateField(blank=True, null=True)
    created_on = models.DateTimeField(auto_now_add = True)

    #print    
    def __unicode__(self):
        return self.title

custom_render:

def custom_render(template_name, data_dict, request):
    return render_to_response(template_name,
                              data_dict,
                              context_instance=RequestContext(request))
A: 

Just given that you do not encounter the problem running manage.py runserver, and you do encounter the problem using mod_wsgi, i'd look at database permissions.

First, are you running mod_wsgi as the same user as you are running python manage.py runserver? If not you need to grant the mod_wsgi user permissions. As an example, try something like this, where apache is the name of the user running mod_wsgi:

sudo su - postgres
createuser -S -D -R apache
psql
< should now be in the psql shell >
grant all on database < your database name > to apache;
Bear
Also think it might be DB related, but this didn't do the trick.
ign