Упрощение логики обработки форм представлений Django - PullRequest
2 голосов
/ 01 ноября 2011

Просто выстрел в темноте, но, возможно, кто-то сможет предложить что-нибудь интересное.

Всякий раз, когда у меня есть формы , на мой взгляд, есть много if-else операторов, и трудно следовать логике. Есть ли какая-то особенность шаблона или языка Python, чтобы упростить это? У меня была эта проблема столько, сколько я себя помню, и до сих пор не нашел хорошего решения.

Вот пример: представление, которое отображает ту же страницу, если есть ошибки, и, если все хорошо, выполняет поиск (в модели) и возвращает страницу с графиками:

def analysis(request):
    context = {'main_navigation' : 'analysis'}
    context['no_results'] = False
    template = 'analysis/analysis.html'

    # Search params?
    if not request.GET:
        form = AnalysisSearchForm()
        context['form'] = form
    else:
        form = AnalysisSearchForm(request.GET)
        context['form'] = form
        if form.is_valid():            
            # Do the search
            results = form.search()

            if len(results) > 0:                
                context['results'] = json.dumps(results, default=encode)
                context.update(form.cleaned_data)

                # Add the compare form
                context['compare_form'] = CompareForm();

                # Add critical level if there is one.
                part = form.cleaned_data.get('part', None)
                if part:
                    level = Level.get(part, "Default")
                    if level is not None:
                        context['level'] = level.value

                template = 'analysis/analysis_graphs.html'
            else:                                
                context['no_results'] = True

    return render_to_response(template, context,
                              context_instance=RequestContext(request))

Как вы можете видеть, вышеприведенное уже упрощено путем перемещения всей логики запросов в метод form.search () , который использует cleaned_data формы, чтобы (в этом случае) связаться с удаленным API и получить результаты.

Ответы [ 2 ]

1 голос
/ 01 ноября 2011

Рассматривали ли вы представления на основе классов (новое в 1.3). Вы пишете свои представления как классы и наследуете необходимую функциональность от нескольких базовых представлений, а также от миксинов. Это означает, что вы можете разбить свои взгляды на составные части и получить хорошее разделение кода:

https://docs.djangoproject.com/en/dev/topics/class-based-views/

Кроме того, существуют миксины, созданные специально для работы с формами:

https://docs.djangoproject.com/en/dev/ref/class-based-views/#formmixin

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

0 голосов
/ 01 ноября 2011

Вот как я буду это делать (с небольшими изменениями и скачками я не нарушил логику функции):

# XXX: Use Dependency injection with the template file.
def analysis(request, template='analysis/analysis.html'): 
    context = {'main_navigation' : 'analysis'}
    context['no_results'] = False

    # XXX: Create only one form here without the need for if else.
    form = AnalysisSearchForm(request.GET or {})
    context['form'] = form

    if form.is_valid():            
        # The rest of your code here ... .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...