Почему моя функция не возвращает объект по его slug в url?

'edit_holiday() получил неожиданный аргумент ключевого слова 'slug'

Хотелось бы, чтобы при нажатии на объект, его slug возвращался в url, который я задаю автоматически в моделях, чтобы он был идентичен названию.

Функция в models.py:

@receiver (post_save, sender = Holiday)
def insert_slug(sender, instance, **kwargs):
    if not instance.slug:
        instance.slug = slugify(instance.HolidayReason)
        return instance.save()

Мой views.py для визуализации объекта:

def edit_holiday(request, pk):
    if request.method == 'GET':
        objeto = Holiday.objects.filter(slug=pk).first()
        
        if objeto is None:
            return redirect(reverse('lista_holiday'))
        
        holiday_list = Holiday.objects.get(slug=pk)
        form = HolidayForm(instance=objeto)
        
        form_holidaycenter_factory = inlineformset_factory(Holiday, HolidayCenter, form=HolidayCenterForm)
        form_holidayloc_factory = inlineformset_factory(Holiday, HolidayLoc, form=HolidayLocForm)
        form_holidaycenter = form_holidaycenter_factory(instance=objeto, prefix='holidaycenter')
        form_holidayloc = form_holidayloc_factory(instance=objeto, prefix='holidayloc')
        
        context = {
            'form': form,
            'form_holidaycenter ': form_holidaycenter,
            'form_holidayloc ': form_holidayloc ,
            'holiday_list ': feriado_list,
        }
        
        return render(request, '../templates/feriado/form_.html', context)
    
    elif request.method == 'POST':
        objeto = Holiday.objects.filter(slug=pk).first()
        
        if objeto is None:
            return redirect(reverse('lista_holiday'))
        
        holiday_list = Holiday.objects.get(slug=pk)
        form = HolidayForm(request.POST, instance=objeto)
        
        form_holidaycenter_factory = inlineformset_factory(Holiday, HolidayCenter, form=HolidayCenterForm)
        form_holidayloc_factory = inlineformset_factory(Holiday, HolidayLoc, form=HolidayLocForm)
        form_holidaycenter = form_holidaycenter_factory(request.POST, instance=objeto, prefix='holidaycenter')
        form_holidayloc = form_holidayloc_factory(instance=objeto, prefix='holidayloc')
        
        
        if form.is_valid() and form_holidayloc .is_valid() and form_holidaycenter.is_valid():
            holiday= form.save()
            form_holidayloc.instance = holiday
            form_holidaycenter.instance = holiday
            form_holidayloc.save()
            form_holidaycenter.save()
            
            messages.success(request, "Feriado adicionado com sucesso!")
            return redirect(reverse('lista_holiday'))
        
        else: 
            context = {
                'form': form,
                'form_holidaycenter ': form_holidaycenter,
                'form_holidayloc ': form_holidayloc ,
                'holiday_list ': feriado_list,
            }
            
            return render(request, '../templates/feriado/form_holiday.html', context)

Мой urls.py:

from django.urls import path
from . import views
from django.contrib.auth.decorators import login_required
from .views import ListaFeriadoView, adicionar_feriado, editar_feriado, ExcluirFeriadoView
from . import views

urlpatterns = [
   path('lista_holiday/', login_required(ListaFeriadoView.as_view()), name='lista_holiday'),
   path('cadastrar_holiday/', login_required(views.adicionar_holiday), name='cadastrar_holiday'),
   path('edit_holiday/<slug:slug>/', login_required(views.edit_holiday), name='edit_holiday'),
   path('excluir_holiday/<slug:slug>', login_required(ExcluirFeriadoView.as_view()), name='excluir_feriado'),
]

но происходит эта ошибка: TypeError at /feriado/edit_holiday/descobrimento-brasil/ edit_holiday() получил неожиданный аргумент ключевого слова 'slug'

Думаю, вам нужно отредактировать файл views.py следующим образом:

def edit_holiday(request, pk):
    if request.method == 'GET':
        objeto = Holiday.objects.filter(slug, pk).first()
        
        if objeto is None:
            return redirect(reverse('lista_holiday'))
        
        holiday_list = Holiday.objects.get(slug =  pk) # invalid argument
        form = HolidayForm(instance=objeto)
        
        form_holidaycenter_factory = inlineformset_factory(Holiday, HolidayCenter, form=HolidayCenterForm)
        form_holidayloc_factory = inlineformset_factory(Holiday, HolidayLoc, form=HolidayLocForm)
        form_holidaycenter = form_holidaycenter_factory(instance=objeto, prefix='holidaycenter')
        form_holidayloc = form_holidayloc_factory(instance=objeto, prefix='holidayloc')
        
        context = {
            'form': form,
            'form_holidaycenter ': form_holidaycenter,
            'form_holidayloc ': form_holidayloc ,
            'holiday_list ': feriado_list,
        }
        
        return render(request, '../templates/feriado/form_.html', context)
    
    elif request.method == 'POST':
        objeto = Holiday.objects.filter(slug, pk).first()
        
        if objeto is None:
            return redirect(reverse('lista_holiday'))
        
        holiday_list = Holiday.objects.get(slug= pk) # invalid argument
        form = HolidayForm(request.POST, instance=objeto)
        
        form_holidaycenter_factory = inlineformset_factory(Holiday, HolidayCenter, form=HolidayCenterForm)
        form_holidayloc_factory = inlineformset_factory(Holiday, HolidayLoc, form=HolidayLocForm)
        form_holidaycenter = form_holidaycenter_factory(request.POST, instance=objeto, prefix='holidaycenter')
        form_holidayloc = form_holidayloc_factory(instance=objeto, prefix='holidayloc')
        
        
        if form.is_valid() and form_holidayloc .is_valid() and form_holidaycenter.is_valid():
            holiday= form.save()
            form_holidayloc.instance = holiday
            form_holidaycenter.instance = holiday
            form_holidayloc.save()
            form_holidaycenter.save()
            
            messages.success(request, "Feriado adicionado com sucesso!")
            return redirect(reverse('lista_holiday'))
        
        else: 
            context = {
                'form': form,
                'form_holidaycenter ': form_holidaycenter,
                'form_holidayloc ': form_holidayloc ,
                'holiday_list ': feriado_list,
            }
            
            return render(request, '../templates/feriado/form_holiday.html', context)

И, вам придется изменить аргумент 2 раза в object.get(), потому что slug не является допустимым аргументом для функции object.get().

Вернуться на верх