【问题标题】:Django: TemplateView or FormView?Django:模板视图还是表单视图?
【发布时间】:2018-11-24 05:59:12
【问题描述】:

我目前正在尝试将基于函数的视图带入基于类的视图中。我目前正在努力解决的问题是我是否应该尝试将其移动到带有 FormMixin 的 TemplateView 或带有 ContextMixin 的 FormView 中。对于如何决定什么是最好的,您有什么建议吗?

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
    })

【问题讨论】:

  • FormView 已经使用ContextMixin,您不必“与”FormView 一起使用。

标签: python django django-forms django-class-based-views


【解决方案1】:

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

Django 的通用 CBV 不是为表单集设计的。我经常看到有人尝试处理UpdateViewCreateView 中的表单集,在我看来这会导致复杂的代码难以理解。

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

【讨论】:

  • 我同意在这种情况下使用django-extra-views,如果您决定走 CBV 路线,我正要自己发布相同的答案。
  • 感谢@Alasdair 的回答。它帮助我决定不使用 CBV。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-26
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-06
相关资源
最近更新 更多