The Latinist
The Latinist

Reputation: 15

'str' object has no attribute 'method'

I am trying to access a request.method in a python view, but I'm getting the error

'str' object has no attribute 'method'

The really odd thing is that I can see no difference between how I set up this page and how I set up another similar page; yet that one works fine and this one does not.

The code I am using is as follows:

main/views.py:

from .alphabetize import alphabetize
from .forms import WordListForm

def alphabetize(request):
    if request.method == "POST":
        form = WordListForm(request.POST)
        if form.is_valid():
            word_list = alphabetize(form.cleaned_data['word_list'])
            return render(request, 'main/alphabetize.html', {'form': form, 'word_list': word_list})
    else:
        form = WordListForm()
        return render(request, 'main/alphabetize.html', {'form': form})

/main/forms.py

class WordListForm(forms.Form):
    word_list = forms.CharField(label="Word List")

main/urls.py

from django.conf.urls import url
from main import views

urlpatterns = [
    url(r'alphabetize', views.alphabetize, name='alphabetize'),
]

main/alphabetize.py

    def alphabetize(s):
        word_list = []
        for word in s.split(','):
            word_list.append(word.strip())
        word_list.sort()
        return ', '.join(word_list)

templates/main/alphabetize.html

{% extends "base.html" %}

{% block content %}
    <form action="/alphabetize" method="post">
        {% csrf_token %}
        {{ form }}
        <input type="submit" value="Submit" />
    </form>

    <p>Your list alphabetized: {{ alpha_list }}</p>
{% endblock content %}

/templates/base.html

{% load staticfiles %}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>My Awesome Django Page</title>
    <meta charset="UTF-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1"/>
    <link rel="stylesheet" href="{% static 'css/style.css' %}">
</head>
<body>
    <div class="main">
        {% block content %}{% endblock content %}
    </div>
</body>
</html>

It seems that for some reason request is a string rather than an HttpRequest object, but I can't figure out why that would be.

Upvotes: 0

Views: 3269

Answers (2)

Daniel Roseman
Daniel Roseman

Reputation: 599610

You have two different functions called alphabetize; your view, and your utility function. As a result your view is calling itself, rather than the other function.

You should rename one of these.

Upvotes: 5

neverwalkaloner
neverwalkaloner

Reputation: 47354

Your view name overrides imported function alphabetize. Change view name to fix:

from .alphabetize import alphabetize
from .forms import WordListForm

def alphabetize_view(request):

Upvotes: 0

Related Questions