@receiver(post_save, sender=FingerPrint)
def update_calculated_fields(sender, instance, **kwargs):
tlsh = instance.calculate_tlsh()
sender.objects.filter(pk=instance.pk).update(tlsh=tlsh)
STATIC_ROOT
— в неё Django копирует файлы из STATICFILES_DIRS
.STATICFILES_DIRS
.STATICFILES_DIRS
каталоги конкретных приложений — Django по умолчанию и так собирает в STATIC_ROOT
всё что найдёт в каталогах static
внутри приложений.STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, "static") # Изначально пустой каталог, куда Django соберёт всё при выполнении manage.py collectstatic
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static_dev"), # Каталог, куда вам нужно складывать статику проекта, не относящуюся к конкретному приложению
]
runserver
, то нужно настроить раздачу статики в режиме разработки. И не забывайте после любых изменений в файлах статики запускать manage.py collectstatic
. Удачи! class Vendor(models.Model):
...
class Module(models.Model):
MODULES_NAME = (
("Sourcing", "Sourcing"), ("SA", "SA"),
("SXM", "SXM"), ("CLM", "CLM"),
...
)
name = models.CharField(max_length=50, choices=MODULES_NAME)
is_active = models.BooleanField(default=True)
class VendorModule(models.Model):
vendor = models.ForeignKey(Vendor, on_delete=models.CASCADE)
module = models.ForeignKey(Module, on_delete=models.CASCADE)
is_active = models.BooleanField(default=True)
info1 = models.TextField(max_length=500)
info2 = models.TextField(max_length=500)
VendorModule
— фактически это связь многие-ко-многим с возможностью сохранения дополнительной информации. Назначение модели Element
непонятно, поэтому дополнительная информация убрана в VendorModule
. Но если вы считаете, что этого недостаточно, то можно сделать так:class Element(models.Model):
vendormodule = models.ForeignKey(VendorModule, on_delete=models.CASCADE)
info1 = models.TextField(max_length=500)
info2 = models.TextField(max_length=500)
{% for status in status_list %}
<h1>{{ status }}</h1>
{% for task in status.tasks.all %}
<h2>{{ task }}</h1>
{% endfor %}
{% endfor %}
runserver
, то нужно настроить раздачу статики в режиме разработки.collectstatic
. manage.py show_urls
VendorsSerializer
в классе CsvToDatabase
заточен на приём данных для одного объекта, а вы передаёте в него список объектов. Варианта два: или передавать с фронта на бэк каждый объект отдельным запросом, или делать CsvToDatabase
способным обработать список объектов.class CsvToDatabase(APIView):
def post(self, request, format=None):
for key, data_item in request.data.items():
serializer = VendorsSerializer(data=data_item)
...
sender
, который будет срабатывать при сохранении любой модели:@receiver(pre_save)
def event_to_history_annals(sender, instance, **kwargs):
try:
Event.objects.create(
instance=f'{instance._meta.app_label}.{instance._meta.object_name}.{instance.pk}',
# Всякие другие поля
)
except Exception as e:
logger.exception('Что-то пошло не так...')
Cart.cart
будет лишь одна запись, потому что ключи одинаковые. Это ошибка раз.def __iter__(self):
# перебор элементов корзины и получение их из базы данных
product_ids = self.cart.keys() # [5]
# получение объекта товара и добавление его в корзину
notes = Notebook.objects.filter(id__in=product_ids) # Notebook.objects.filter(id__in=[5])
phones = Phone.objects.filter(id__in=product_ids) # Phone.objects.filter(id__in=[5])
id == 5
. Это ошибка два.Cart
. Например, вы можете заменить ключи на такие:product_id = f'{product._meta.app_label}.{product._meta.object_name}.{product.pk}'
filename[-4:]
расширение файла лучше получать так: os.path.splitext(filename)
. Ну или проверку делать так if filename.endswith('.csv')
. get_queryset
возможен только один аргумент — self
. Чтобы внутри этого метода получить category_slug
тебе нужно обращаться к self.kwargs
— в этом словаре находятся все переменные, которые ты определил в urls. То есть твой код должен выглядеть примерно так:def get_queryset(self):
self.category = None
if 'category_slug' in self.kwargs:
self.category = get_object_or_404(Category, slug=self.kwargs['category_slug'])
return Product.objects.filter(category=self.category)
return Product.objects.filter(available=True)