2016-01-10 3 views
0

Существует фильтр, который добавляет к форме функциональность django_crispy_form. Все аргументы передаются как строка, деленная на ",".Возможно, круговой импорт в приложении django?

# -*- coding: utf-8 -*- 
from crispy_forms.helper import FormHelper 
from crispy_forms.layout import Submit 
from django.core.urlresolvers import reverse 
from django.template import Library 

register = Library() 

#args=[url_name, submit_button_text, optional_<pk>] 
@register.filter 
def with_submit(form, args): 
    sargs = args.split(',') 
    action, name = sargs[:2] 
    if len(sargs) > 2: 
     args = sargs[2:] 
    else: 
     args = None 
    helper = FormHelper() 
    helper.form_method = 'POST' 
    if args: 
     #there exception throwed every time if len of args > 2 
     helper.form_action = reverse(action, int(args[0])) 
    else: 
     helper.form_action = reverse(action) 

    helper.add_input(Submit(action, name, css_class='btn btn-primary')) 
    form.helper = helper 
    return form 

Когда я использую этот фильтр без третьего необязательного аргумента - это работает отлично, но когда я добавить третий < рк> аргумент - это сбой и говорит:

The included URLconf '1' does not appear to have any patterns in it. If you see valid patterns in the file then the issue is probably caused by a circular import. 

И я не знаю, где Я должен найти круговой импорт.

ответ

1

Сигнатура метода reverse является:

reverse(viewname, urlconf=None, args=None, kwargs=None, current_app=None) 

Таким образом, ваш второй аргумент int(args[0]) в настоящее время передается в качестве urlconf, которая ведет к исключению. Вы должны использовать

reverse(action, args=int(args[0])) 

Всякий раз, когда вы пишете тег шаблона или фильтры, вы должны быть очень осторожны, что вы код так просто и так надежен, как это возможно. Пользовательские теги и фильтры являются наиболее сложными частями приложения django для отладки.

Рассмотрим следующую строку:

action, name = sargs[:2] 

Эта линия поднимет ValueError, если не точно два пункта в sargs[:2]. Перед выполнением этого утверждения вы должны сделать чек.

Смежные вопросы