Django:TemplateView或FormView? [英] Django: TemplateView or FormView?

查看:217
本文介绍了Django:TemplateView或FormView?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我目前正在尝试将基于函数的视图带入基于类的视图。我目前正在苦苦挣扎的问题是我是否应该尝试将其移动到具有FormMixin的TemplateView或具有ContextMixin的FormView中。您是否有任何技巧决定最佳选择?

I am currently trying to bring my function-based view into a class-based view. The question I am currently struggling with is if I should either trying to move it into a TemplateView with FormMixin or in a FormView with ContextMixin. Do you have any tips on how to decide what's best?

def event_detail_view(request, event, organizer):
    queryset = Event.objects.filter(organizer__slug=organizer)
    event = get_object_or_404(queryset, slug=event)
    tickets = collect_all_tickets(event, organizer)
    ReserveFormSet = formset_factory(ReserveForm, formset=BaseReserveFormSet, extra=0)
    formset = ReserveFormSet(
        initial=tickets,
        # Example [{'ticket': "Early Bird"}, {'ticket': "Regular Ticket"},]
        form_kwargs={'organizer_slug': organizer}
    )
    if request.method == 'POST':
        formset = ReserveFormSet(
            request.POST,
            initial=tickets,
            form_kwargs={'organizer_slug': organizer}
        )
        if formset.is_valid():
            order_reference = unique_order_reference_generator()
            for form in formset:
                ticket_name = form.cleaned_data['ticket'].name
                int_or_empty = form.cleaned_data['quantity']
                qty = is_int_or_zero(int_or_empty)
                if qty > 0:
                    obj = form.save(commit=False)
                    obj.ticket_name = ticket_name
                    obj.order_reference = order_reference
                    obj.save()
            return redirect('organizers:index', organizer=organizer)

    ticket_status = {}
    ticket_status['sold_out'] = TicketStatus.SOLD_OUT
    ticket_status['on_sale'] = TicketStatus.ON_SALE

    return render(request, 'events/event_detail.html', {
        'event': event,
        'formset': formset,
        'ticket_status': ticket_status,
        'tickets': tickets
    })


推荐答案

基于类的视图不会自动优于基于函数的视图。如果您有基于函数的视图,请仔细考虑是否要将其转换为基于类的视图。

Class-based-views are not automatically better than function-based-views. If you have a function-based-view, then think carefully about whether you want to convert it to a class-based-view.

Django的通用CBV并非旨在用于表单集。我经常看到人们试图在 UpdateView CreateView 中处理表单集,我认为这会导致复杂的代码难以实现理解。

Django's generic CBVs are not designed for formsets. I often see people trying to process formsets in UpdateView or CreateView and in my opinion it leads to complicated code that is difficult to understand.

如果必须使用基于类的视图来处理表单集,则可能需要查看 django-extra-views 包含一些您可能会觉得有用的视图。

If you must use a class based view to handle your formset, you might want to look at django-extra-views which contains some views you might find useful.

这篇关于Django:TemplateView或FormView?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆