Правильный способ переопределения потока просмотра URL (Обратное для «подробности» не найдено. «Подробность» не является допустимой функцией представления или именем шаблона.)

я застрял с ошибкой:

Reverse for 'detail' not found. 'detail' is not a valid view function or pattern name.

когда я пытался переопределить AssignTaskView View.

Обоснование этого состоит в том, чтобы позволить моему пользователю переназначать задачи другим без необходимости создавать для этого отдельную задачу, а также помещать мои пользовательские формы для отображения списка пользователей на выбор.

Больше всего меня вдохновил этот конкретный пост:

Перезаписать представление django с помощью пользовательского контекста (Django 1.11, Viewflow)

И вот мой код:

url.py

На самом деле это позволяет мне переопределять и отображать мою собственную форму.

    path('pipeline/<process_pk>/documents/<task_pk>/assign/', OverrideTaskView.as_view(), {
     'flow_class': Pipeline,
     'flow_task': Pipeline.documents
}),

проблема кроется здесь:

просмотры.py

class OverrideTaskView(AssignTaskView,FormView):
form_class=AssignForm

def get_form_kwargs(self):
    kwargs = super(OverrideTaskView, self).get_form_kwargs()
    kwargs.update({'id': self.request.user})
    return kwargs

def get_context_data(self, **kwargs):
    context = super(AssignTaskView, self).get_context_data(**kwargs)
    context['activation'] = self.activation
    return context

def form_valid(self, form):
    if '_assign' or '_continue' in request.POST:
        form.save(commit=False)
        assigned = form.cleaned_data.get('user')
        self.activation.assign(assigned)
        self.success(_('Task {task} has been assigned'))
        return HttpResponseRedirect(self.get_success_url())
    else:
        return self.get(request, *args, **kwargs)

Я подозреваю, что это как-то связано с get_success_url? Ошибка появляется только после того, как я нажму кнопку подтверждения, пожалуйста, помогите!

редактировать

Это шаблоны URL, найденные на моей странице отладки:

^pipeline/(?P<process_pk>\d+)/documents/(?P<task_pk>\d+)/assign/$ 
[name='documents__assign']
pipeline/ ^archive/$ [name='archive']
pipeline/ ^action/cancel/(?P<process_pk>\d+)/$ [name='action_cancel']
pipeline/ ^(?P<process_pk>\d+)/$ [name='detail']   #<--- its here!!

полная трассировка ошибок

Internal Server Error: /pipeline/35/documents/195/assign/
Traceback (most recent call last):
  File "C:\Users\Dion Neo Wen Shun\AppData\Local\Programs\Python\Python38\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "C:\Users\Dion Neo Wen Shun\AppData\Local\Programs\Python\Python38\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\Users\Dion Neo Wen Shun\AppData\Local\Programs\Python\Python38\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\Dion Neo Wen Shun\AppData\Local\Programs\Python\Python38\lib\site-packages\django\views\generic\base.py", line 71, in view
    return self.dispatch(request, *args, **kwargs)
  File "C:\Users\Dion Neo Wen Shun\AppData\Local\Programs\Python\Python38\lib\site-packages\django\utils\decorators.py", line 43, in _wrapper
    return bound_method(*args, **kwargs)
  File "C:\Users\Dion Neo Wen Shun\AppData\Local\Programs\Python\Python38\lib\contextlib.py", line 75, in inner
    return func(*args, **kwds)
  File "C:\Users\Dion Neo Wen Shun\AppData\Local\Programs\Python\Python38\lib\site-packages\viewflow\decorators.py", line 213, in _wrapper
    return view(request, **kwargs)
  File "C:\Users\Dion Neo Wen Shun\AppData\Local\Programs\Python\Python38\lib\site-packages\viewflow\flow\views\task.py", line 197, in dispatch
    return super(AssignTaskView, self).dispatch(request, *args, **kwargs)
  File "C:\Users\Dion Neo Wen Shun\AppData\Local\Programs\Python\Python38\lib\site-packages\django\views\generic\base.py", line 97, in dispatch
    return handler(request, *args, **kwargs)
  File "C:\Users\Dion Neo Wen Shun\AppData\Local\Programs\Python\Python38\lib\site-packages\viewflow\flow\views\task.py", line 175, in post
    self.success(_('Task {task} has been assigned'))
  File "C:\Users\Dion Neo Wen Shun\AppData\Local\Programs\Python\Python38\lib\site-packages\viewflow\flow\views\mixins.py", line 90, in success
    self.report(message, level=messages.SUCCESS, fail_silently=fail_silently, **kwargs)
  File "C:\Users\Dion Neo Wen Shun\AppData\Local\Programs\Python\Python38\lib\site-packages\viewflow\flow\views\mixins.py", line 69, in report
    process_url = reverse('{}:detail'.format(namespace), args=[self.activation.process.pk])
  File "C:\Users\Dion Neo Wen Shun\AppData\Local\Programs\Python\Python38\lib\site-packages\django\urls\base.py", line 87, in reverse
    return iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs))
  File "C:\Users\Dion Neo Wen Shun\AppData\Local\Programs\Python\Python38\lib\site-packages\django\urls\resolvers.py", line 677, in _reverse_with_prefix
    raise NoReverseMatch(msg)
django.urls.exceptions.NoReverseMatch: Reverse for 'detail' not found. 'detail' is not a valid view function or pattern name.
[08/Apr/2020 22:37:24] "POST /pipeline/35/documents/195/assign/ HTTP/1.1" 500 129534

Я действительно не знаю, что происходит!


person neowenshun    schedule 08.04.2020    source источник
comment
Кажется, что этот метод переопределения приведет к тому, что встроенные URL-адреса будут недоступны для поиска django. Мне пришлось перезаписать все остальные представления, чтобы это как-то сработало. Может ли кто-нибудь указать на ошибку, которую я делаю? Я буду очень признателен!   -  person neowenshun    schedule 08.04.2020


Ответы (2)


Я попытался установить расширения django и использовал метод show_urls. Это подсказало мне, что название немного отличалось от других, например:

Вот URL, который я переопределил:

/pipeline/<process_pk>/documents/<task_pk>/assign/      cash.views.OverrideTaskView     cash:documents__assign

Вот исходный URL

/pipeline/<process_pk>/documents/<task_pk>/assign/      viewflow.flow.views.task.AssignTaskView cash:pipeline:documents__assign

следовательно, в моем urls.py в моем проекте (а не в конфигурации корневого URL-адреса)

я добавил в этот переопределенный URL

path('pipeline/<process_pk>/documents/<task_pk>/assign/',
    OverrideTaskView.as_view(),
    {'flow_class': Pipeline,
    'flow_task': Pipeline.documents},
    name="pipeline:{}__assign".format(Pipeline.documents.name)),

Однако это не решило проблему.

Я добавил оператор печати в пользовательское представление назначения:

print(self.request.resolver_match.namespace)

и это дало мне:

cash

что было неправильно, как и должно было быть:

cash:pipeline

Следовательно, система пыталась найти URL-адрес не в том каталоге? (я предполагаю)

В любом случае, я решил проблему, поместив это в URL-адрес успеха:

    def get_success_url(self):
    """Continue on task or redirect back to task list."""
    url = self.activation.flow_task.get_task_url(
        self.activation.task, url_type='guess', user=self.request.user,
        namespace=self.request.resolver_match.namespace + ':' + 'pipeline')

    back = self.request.GET.get('back', None)
    if back and not is_safe_url(url=back, allowed_hosts={self.request.get_host()}):
        back = '/'

    if '_continue' in self.request.POST and back:
        url = "{}?back={}".format(url, urlquote(back))
    elif back:
        url = back

    return url
person neowenshun    schedule 09.04.2020

чтобы переопределить представление назначения, вы можете передать assign_view_class конструктору представления, например

flow.View(..., assign_view=MyView.as_view())

Или создайте собственный узел с переопределенным атрибутом assign_view_classhttps://github.com/viewflow/viewflow/blob/master/demo/shipment/flows.py#L57

person kmmbvnr    schedule 26.01.2021