Правильный способ переопределения потока просмотра URL-адреса (обратный для «детализации» не найден. «Деталь» не является допустимой функцией представления или именем шаблона.) - PullRequest
0 голосов
/ 08 апреля 2020

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

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

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

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

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

Перезапись 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
}),

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

views.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? Ошибка появляется только после того, как я нажимаю кнопку подтверждения, помогите!

edit

Это шаблоны 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

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

1 Ответ

0 голосов
/ 09 апреля 2020

Я попытался установить django -extensions и использовал метод 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 в моем проекте (не root url config)

Я добавил в этот 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

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

cash:pipeline

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

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

    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
...