Как правильно передать поле из модели в качестве аргумента функции в моем Views.py
Я объясняю: У меня есть две модели под названием Diagram и Parts respectability.
manage.py
Это моя модель диаграммы:
from django.db import models
import random, string
def id_generator(size=10, chars=string.digits):
return ''.join(random.choice(chars) for _ in range(size))
class Diagram(models.Model):
fuel_type_choices = [('liquid_propane', 'L.P.'), ('natural_gas','N.G.'),]
item_type_choices = [
('conversion_kits','CONVERSION KITS'),
('griddle_parts','GRIDDLE PARTS'),
('grill_parts','GRILL PARTS'),
('kegorator_parts','KEGORATOR PARTS'),
('outdoor_kitchen_parts','OUTDOOR KITCHEN PARTS'),
('pizza_oven_parts','PIZZA OVEN PARTS'),
('power_burner_parts','POWER BURNER PARTS'),
('refrigerator_parts','REFRIGERATOR PARTS'),
('rotisserie_parts','ROTISSERIE PARTS'),
('searing_station_parts','SEARING STATION PARTS'),
]
diagram_id = models.CharField(primary_key=True, max_length = 10, blank = True, unique = True)
mpn = models.CharField(max_length = 50, blank = False, unique=True)
model = models.CharField(max_length = 50, blank = False)
name = models.CharField(max_length = 500, blank = False)
image = models.ImageField(upload_to = 'img/diagrams/')
number_of_references = models.IntegerField(null=True, blank=False)
fuel_type = models.CharField(max_length = 15, choices = fuel_type_choices, default = False)
item_type = models.CharField(max_length = 25, choices = item_type_choices, default = False)
map_area = models.TextField(null=True)
def save(self):
if not self.diagram_id:
# Generate ID once, then check the db. If exists, keep trying.
self.diagram_id = id_generator()
while Diagram.objects.filter(diagram_id=self.diagram_id).exists():
self.diagram_id = id_generator()
super(Diagram, self).save()
def __str__(self):
return self.name
А это моя модель детали:
from django.db import models
import random, string
def id_generator(size=10, chars=string.ascii_uppercase + string.digits):
return ''.join(random.choice(chars) for _ in range(size))
class Part(models.Model):
warranty_choices = (
('0','0'),
('1','1'),
('2','2'),
('3','3'),
('4','4'),
('5','5'),
('6','6'),
('7','7'),
('8','8'),
('9','9'),
('10','10'),
('lifetime','LIFETIME'),
)
manufacturer_choices = (
('bull', 'BULL'),
)
catalog_id = models.CharField(primary_key=True, max_length = 10, blank = True, unique = True)
part_number = models.CharField(max_length = 50, blank = False, unique = True)
name_description = models.CharField(max_length = 500, blank = False)
image_part = models.ImageField(upload_to='img/parts/', default='img/default.jpg')
warranty = models.CharField(max_length = 25, choices = warranty_choices, default = '0')
manufacturer = models.CharField(max_length = 100, choices = manufacturer_choices, default=False)
haslink = models.BooleanField(default = False)
def save(self):
if not self.catalog_id:
# Generate ID once, then check the db. If exists, keep trying.
self.catalog_id = id_generator()
while Part.objects.filter(catalog_id=self.catalog_id).exists():
self.catalog_id = id_generator()
super(Part, self).save()
def __str__(self):
return self.name_description
Теперь у меня есть файл функции, который я импортирую в мой views.py:
import requests
from bs4 import BeautifulSoup
from parts.models import Part
list_part = Part.objects.all().order_by('part_number')
pms_list = {}
def getPmsPriceForBull(part_number):
pms_url = "https://powermowersales.com/bull-"
url = pms_url + str(part_number)
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
price = str(soup.find(id = "price").text)
return price
А это мой views.py
from django.shortcuts import render
from django.shortcuts import get_object_or_404
from django.views.generic import CreateView
from django.core import serializers
from django.contrib.auth.views import LoginView
from django.contrib.messages.views import SuccessMessageMixin
from .models import Diagram
from parts.models import Part
from .forms import DiagramDataEntryForm, LoginForm
from .functions import getpricing
def home_view(request):
return render(request, 'home.html')
def bull_main(request):
diagrams = Diagram.objects.all()
return render(request, 'bull/bull_main.html', {'diagrams':diagrams})
def bull_diagram(request, diagram_id):
diagram = get_object_or_404(Diagram, diagram_id = diagram_id)
part_list = Part.objects.all().order_by('part_number')
q = {}
for x in part_list:
if x.part_number:
q[x.part_number] = getpricing.getPmsPriceForBull(x.part_number)
parts = serializers.serialize("json", Part.objects.all().order_by('part_number'))
return render(request, 'bull/bull_diagram.html', {"diagram":diagram, "parts":parts,})
class DiagramDataEntry(SuccessMessageMixin, CreateView):
model = Diagram
form_class = DiagramDataEntryForm
success_url= "/bull/"
initial = {'key': 'value'}
template_name = 'bull/new_diagram.html'
success_message = "%(name)s was created successfuly"
class CustomLoginView(LoginView):
form_class = LoginForm
def form_valid(self, form):
remember_me = form.cleaned_data.get('remember_me')
if not remember_me:
# set session expiry to 0 seconds. So it will automatically close the session after the browser is closed.
self.request.session.set_expiry(0)
# Set session as modified to force data updates/cookie to be saved.
self.request.session.modified = True
# else browser session will be as long as the session cookie time "SESSION_COOKIE_AGE" defined in settings.py
return super(CustomLoginView, self).form_valid(form)
Теперь я пытаюсь сделать следующее: Конкретно в этой части def bull_diagram(request, diagram_id):. Я создал пустой dict и хочу вызвать функцию getPmsPriceForBull из файла getpricing.py с аргументом x.part_number, который является одним из полей моей модели, и я получаю следующую ошибку:
У объекта 'NoneType' нет атрибута 'text'
и вот основные строки:
q[x.part_number] = getpricing.getPmsPriceForBull(x.part_number)
price = str(soup.find(id = "price").text)