Django: почему моя форма отправляет данные POST, но возвращает request.method GET?

Я ожидаю, что оператор print (request.method) в моем views.py вернет POST ниже. Я видел другие примеры кода, где request.method - это POST. Однако мой код просто выводит GET:

test1

GET

Я вижу, что форма отправляет данные POST, когда я отправляю информацию https://imgur.com/a/BSLLAgB

Немного покопавшись, я обнаружил, что HTTP не предназначен для перенаправления данных POST:

https://softwareengineering.stackexchange.com/questions/99894/why-doesnt-http-have-post-redirect

Но заставляет меня спросить почему мой код перенаправляет эти данные POST? Я ожидал, что мои представления вернут «POST», а не «GET», потому что я, например, не использую HttpResponseRedirect. Хотел бы понять, почему это происходит, и что я могу сделать, чтобы Django не перенаправлял эти данные POST для получения GET. Что мне не хватает?

urls.py

from django.urls import path

from . import views

urlpatterns = [
    path('', views.index, name = 'index'),
    path('add_coin/', views.add_coin, name = 'add_coin'),
    path('register/', views.register, name = 'register'),
    path('login/', views.user_login, name='login'),
    path('logout/', views.user_logout, name='logout')
]

forms.py

class PortfolioForm(forms.ModelForm):
    coin = forms.ModelChoiceField(queryset = Coin.objects.all()) 
    amount = forms.IntegerField() 
    trade_price = forms.DecimalField(decimal_places = 2)

    field_order = ['coin', 'amount', 'trade_price']

    class Meta:
        model = Portfolio
        fields = {'coin', 'amount', 'trade_price', 'user'}
        exclude = ['user']

add_coin.html

<form action = "{% url index %)" method = "post" name = "add_coin">
     <table>
          {{ form }}
     </table>
     {% csrf_token %}
     <input type = "submit" name = "add_coin" formmethod = "post" value = "Add Coin">
</form>

Индексное представление (views.py)

def index(request):

    portfolio_list = []
    for coin in Portfolio.objects.filter(user = request.user): #(user = request.user.username):
        portfolio_dict = {}

        coin_str = str(coin.coin)

        portfolio_dict['coin'] = coin_str 
        portfolio_dict['amount'] = coin.amount 
        portfolio_dict['symbol'] = GetCoin(coin_str).symbol 
        portfolio_dict['price'] = GetCoin(coin_str).price 
        portfolio_dict['value'] = GetCoin(coin_str).price * coin.amount 
        portfolio_dict['last_updated'] = GetCoin(coin_str).last_updated 
        portfolio_dict['daily_change'] = GetCoin(coin_str).percent_change_24h
        portfolio_dict['gains'] = coin.trade_price - GetCoin(coin_str).price

        portfolio_list.append(portfolio_dict)
        #print(portfolio_list)  

    def get_top_coins(limit): # display coins if no user is logged in       
        data = requests.get("https://api.coinmarketcap.com/v1/ticker/?limit = {}".format(limit)).json()
        y = 0
        coin_list = {
            "image": [],
            "name": [],
            "price": [],
            "symbol": [],
            "market_cap": []
        }

        for x in data:
            coin_list["name"].append(data[y]['name'])
            coin_list["price"].append(data[y]['price_usd'])
            coin_list["symbol"].append(data[y]['symbol'])
            coin_list["market_cap"].append(data[y]['market_cap_usd'])

            y += 1 

        return coin_list

    coin_list = get_top_coins(20)

    for x in coin_list["name"]:
        image = "{}.png".format(x)
        coin_list["image"].append(image)

    context_dict = {'portfolio_list': portfolio_list, 'coin_list': zip(coin_list["image"], coin_list["name"], coin_list["price"], coin_list["market_cap"])}

    return render(request, 'myportfolio/index.html', context = context_dict)

представление add_coin (Views.py):

def add_coin(request):
    print("test 1")
    print(request.method)
    form = PortfolioForm()
    if request.method == "POST":
        form = PortfolioForm(request.POST)
        if form.is_valid():
            print("test 2")
            obj = form.save(commit = False)
            obj.user = request.user
            obj.save()
        else: 
            print(form.errors)

    return render(request, 'myportfolio/add_coin.html', {'form': form})

Вам следует использовать {% url 'index' %) (в кавычках), если вы не хотите, чтобы index рассматривался как переменная. Если вы публикуете сообщение в режиме просмотра индекса, вы должны включить это в свой вопрос.

Alasdair 01.05.2018 11:56

Я просто изменил это, когда вы комментировали, теперь он включен.

SkillSet12345 01.05.2018 12:06
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
2 762
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Форма, по-видимому, обрабатывается представлением add_coin, поэтому вам следует изменить действие формы, чтобы отправить в нее сообщение.

<form action = "{% url 'add_coin' %}" method = "post" name = "add_coin">

Тогда я ожидал увидеть

test1

GET

когда вы выполняете начальный запрос GET к представлению add_coin, и

test1

POST

когда вы отправляете форму с запросом POST.

Спасибо, это обнаружило новую проблему с моими URL-адресами, поэтому теперь мне нужно изучить пространства имен URL-адресов. Когда я нажимаю "Отправить" в своей форме, я получаю сообщение об ошибке "Страница не найдена": The current path, myportfolio/add_coin/{% url 'add_coin' %), didn't match any of these. .

SkillSet12345 01.05.2018 13:16

Это не проблема с пространством имен. Вы скопировали %) из моего ответа. Это должен быть %}.

Alasdair 01.05.2018 14:04

Другие вопросы по теме