Django Использование iex api через поле модели
Здравствуйте, поэтому я опубликую свой код, потому что я надеюсь, что он объясняет мою ситуацию лучше, чем я могу сделать :) Я не могу разобраться с частью views.py, потому что не знаю, как я могу использовать аргумент для iexcloud_watchlist. Так что если кто объяснит, как мне правильно подключить мой api.py iexcloud_watchlist и watchlist_one из views.py, я буду очень благодарен. Я пробовал это с
ticker = iexcloud_watchlist(query)
, но это не работает, потому что выдает ошибку
watchlist_one() missing 1 required positional argument: 'ticker'
models.py
from django.db import models
from django.contrib.auth.models import User
class Watchlist(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
name = models.CharField(max_length=20, unique=True)
description = models.CharField(max_length=50, null=True)
updated = models.DateTimeField(auto_now=True)
ticker = models.CharField(max_length=10, default='')
def __unicode__(self):
return str(self)
api.py
import requests
def iexcloud_watchlist(ticker):
response = requests.get(f'https://cloud.iexapis.com/stable/stock/{ticker}/quote?
displayPercent=true&token=mytoken')
try:
return response.json()
except Exception as e:
e = "Error"
views.py
def watchlist_one(request, pk, ticker):
Watchlist.objects.get(id=pk)
model = Watchlist.objects
query = model.all().values_list('ticker', flat=True)
ticker = iexcloud_watchlist(query)
context = {
'list_ticker':query,
'ticker':ticker,
}
return render(request, 'App1/watchlist_one.html', context)
Скорее всего, это связано с ошибкой в вашем urls.py. watchlist_one требует 3 аргумента, django убеждается, что запросы будут переданы функции view.
В вашем urls.py должен быть URL, который выглядит примерно так "watchlist/int:pk/str:ticker/"
Я также не уверен в коде, который вы используете. Я оставлю несколько комментариев по этому поводу ниже
def watchlist_one(request, pk, ticker):
Watchlist.objects.get(id=pk) # You're retrieving an object here, but not actually using it
model = Watchlist.objects # Redundant step as you could just do Watchlist.objects.all()
query = model.all().values_list('ticker', flat=True)
ticker = iexcloud_watchlist(query)
context = {
'list_ticker':query,
'ticker':ticker,
}
return render(request, 'App1/watchlist_one.html', context)
Я бы сделал что-то вроде этого.
def watchlist_one(request, pk):
obj = Watchlist.objects.get(id=pk)
query = obj.values_list('ticker', flat=True)
ticker = iexcloud_watchlist(query)
context = {
'list_ticker':query,
'ticker':ticker,
}
return render(request, 'App1/watchlist_one.html', context)