Привет, читающему данный пост!
Меня попросили добавить SEO поле в админке Django, потому что я "Тыжпрограммист". Но я в нем не очень шарю и прошу вашей помощи. Ибо я больше по фронт-энду.
В админке все разбито по модулям и связано между собой. Есть раздел 'Круизы'' в нем
Локации, Картинки, сами
Круизы,
SEO и т.д. Думаю, с примером будет понятнее...
Например: добавляю страницу круиза "
Example 1" в категории "
Location 1", при добавлении SEO форм нет. Сохранил и иду в раздел SEO заполняю форму и в конце выбираю из списка (там html select) "
Example 1" + ниже есть чекбокс "
Listing" ( допустим я нажал на него) и сохранил. В SEO есть выбор только круизов, категорий нет.
Теперь, если я перейду на сайте в Example 1 появятся SEO данные, и они же появятся на странице раздела сайта Location 1, Location 2, Location 3 и т.д., т.к. я выбрал чекбокс "
Listing" . Если не выбирать
Listing, то на странице с локациями исчезнет SEO.
Что требуется?
Нужно в разделе SEO добавить возможность выбора категорий с локациями, чтобы и Location 1, Location 2, Location 3 и т.д. имели свое уникальное описание.
Я сам пытался сделать, даже получалось вывести локации, но итог всегда 500 ошибка на сайте или невозможно сохранить seo форму....
models.py
class SEO(models.Model):
title = I18nTextField(_('SEO Title'))
description = I18nTextField(_('SEO Description'))
keywords = I18nTextField(_('SEO Keywords'))
index = models.BooleanField(default=True)
cruise = models.ForeignKey(Cruise, on_delete=models.CASCADE, verbose_name='Cruise')
listing = models.BooleanField(default=False)
def __str__(self):
return self.title[LANGUAGE_CODE]
views.py
def get_cruise_locations():
return CruiseLocation.objects.order_by('order').values_list(named=True).all()
def listing(request, cruise_location=None):
cruise_locations = get_cruise_locations()
if cruise_locations.__len__() == 0:
return redirect('index')
if cruise_location is None:
return redirect('cruises_listing', cruise_location=cruise_locations[0].slug)
cruises = Cruise.objects.filter(location__slug=cruise_location).select_related('schedule').all()
goldenCruise = []
for cruise in cruises:
if request.user.is_authenticated and request.user.is_agency:
ag_price_obj = AgencyPrice.objects.filter(agency_id=request.user.id, is_active=True).first()
if ag_price_obj is not None:
cruise.price = ag_price_obj.price.real
goldenCruise.append({
'cruise': cruise,
'image': get_image_through_proxy(
get_image_by_user_agent(request, cruise.cruise_listing_image.image)
)
})
return render(request, "cruises/listing.html", {
'locations': cruise_locations,
'active_location': cruise_location,
'cruises': goldenCruise,
'lang': get_language(),
'administration_phone_objects': get_administration_phone_objects(),
'administration_email_objects': get_administration_email_objects(),
'yacht_objects': get_yachts(),
'site_rules_objects': get_site_rules_objects(),
'header_links': get_header_links(request),
'counters': get_counters(),
'seo': SEO.objects.filter(listing=True).first()
})
def cruise(request, cruise_location, cruise_slug):
cruise_selected = Cruise.objects.filter(location__slug=cruise_location, slug=cruise_slug).select_related('schedule').first()
cruise_images = CruiseImage.objects.filter(cruise=cruise_selected, is_active=True).order_by('order').all().values_list(named=True)
gallery = []
for image in cruise_images:
gallery.append({
'image': get_image_through_proxy(image.image.get('Desktop_1920'))
})
if request.user.is_authenticated and request.user.is_agency:
ag_price_obj = AgencyPrice.objects.filter(agency_id=request.user.id, is_active=True).first()
if ag_price_obj is not None:
cruise_selected.price = ag_price_obj.price.real
return render(request, "cruises/cruise.html", {
'seo': SEO.objects.filter(cruise_id=cruise_selected.id, listing=False).first(),
'cruise': cruise_selected,
'gallery': gallery,
'lang': get_language(),
'administration_phone_objects': get_administration_phone_objects(),
'administration_email_objects': get_administration_email_objects(),
'yacht_objects': get_yachts(),
'site_rules_objects': get_site_rules_objects(),
'header_links': get_header_links(request),
'counters': get_counters()
})