Я ожидаю, что оператор 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})
Я просто изменил это, когда вы комментировали, теперь он включен.
Форма, по-видимому, обрабатывается представлением 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.
.
Это не проблема с пространством имен. Вы скопировали %)
из моего ответа. Это должен быть %}
.
Вам следует использовать
{% url 'index' %)
(в кавычках), если вы не хотите, чтобыindex
рассматривался как переменная. Если вы публикуете сообщение в режиме просмотра индекса, вы должны включить это в свой вопрос.