让对象状态决定Django中的form_class

时间:2015-06-06 20:02:55

标签: python django

我有一位经理

class OrderManager(models.Manager):
    STATE_REQUESTED = 0
    STATE_PROCESSED = 1
    STATE_CONFIRMED = 2
    STATE_CHOICES = [
        (STATE_REQUESTED, _('Requested')),
        (STATE_PROCESSED, _('Processing')),
        (STATE_CONFIRMED, _('Confirmed')),
    ]

    def requested(self):
        return self.filter(state=self.STATE_REQUESTED)

对于订单可以处于的每个州,需要不同的UpdateView

控制此问题的最佳方法是什么?我可以为每个州制作一个视图,例如RequestOrderViewProcessOrderViewConfirmOrderView。但是,如何在模板中检查链接应指向哪个视图?

如何在视图和模板中检查对象是否处于特定状态?我想我可以使用context['requested_orders'] = Order.objects.requested()的查询集填充模板,并使用

签入模板
{% if object in requested_orders %}
...
<a href="{% url 'process_order' object.id %}">Process order</a>
...
{% elif object in processed_orders %}
...
<a href="{% url 'confirm_order' object.id %}">Confirm order</a>
...
{% endif %}

但这是一种聪明的方法吗?

2 个答案:

答案 0 :(得分:0)

你有没有一个直接包含该类型的网址作为选择器?

url(
    r'^(?P<action>[-\w]+)_order/(?P<id>[0-9]+)$', 
    views.YourView, 
    name="order")

并创建如下链接:

<a href="{% url 'order' id=object.id action=object.action %}">
    {{ object.action }} order
</a>

答案 1 :(得分:0)

您可以覆盖get_form_class()方法并为每个对象状态返回不同的表单。您还可以覆盖get_template方法,以根据对象状态返回不同的模板。