如何将Django表单值传递给模型类方法

时间:2010-08-02 12:28:37

标签: django django-forms django-templates

将请求信息传递给模型类方法的最佳方法是什么?

我想知道我的逻辑是否在错误的地方。也许我需要将它从我的模型中移出。

我希望能够传递POST变量或表单,以按国家或机构过滤模型。

我无法从模板中做到这一点,但问题是我是否应该以某种方式从模型或控制器中做到这一点。

我的模特:

class AccountExtra(User):

def myPendingPaymentSchedules(self, status=1, **args):

    if self.is_staff:     # status = approved by MFI
        schedules = PaymentSchedule.objects.select_related(depth=3).filter(active=True)

        if country:
            schedules = schedules.filter(country=country)

        if institution:
            schedules = schedules.filter(institution=institution)            

        return schedules

我的控制器:

myAccount = get_object_or_404(AccountExtra, id=request.user.id)  

我的模板

{% for sample in myAccount.myPendingPaymentSchedules %}  # Can't pass parameters for country, etc

2 个答案:

答案 0 :(得分:3)

是的,我会说你的逻辑是在错误的地方。我不知道你试图传递给myPendingPaymentSchedules的价值来自何处,但它似乎应该在视图而不是模板中完成。然后,您可以将生成的计划直接传递到模板上下文中。

(顺便说一句,你的命名方案不是非常Pythonic:我使用my_accountmy_pending_payment_schedules - 请参阅PEP8

答案 1 :(得分:1)

感谢您的反馈。我已经做过一些关于如何从模板中访问业务登录的研究,我想我会提供更新,以防其他人在搜索结果中找到这个问题:

有两种情况需要传递方法的参数:

案例#1)将参数传递给单个值

如果我们只有一个帐户,我们可以通过控制器中的单个调用将它们传递给模型,并将结果作为单个上下文变量传递给模板。

模型

class AccountExtra(models.Model):
..

def my_pending_payment_schedules(self, status=1, country=None, institution=None)

    if self.is_staff: 
        schedules = payment_schedule.objects.filter(active=True)

        if country:
            schedules = schedules.filter(product__country=country)

        if institution:
            schedules = schedules.filter(product__institution=institution)

        return schedules

控制器

my_account = get_object_or_404(AccountExtra, id=request.user.id)     

form = staff_approval_form(request.POST)

if form.is_valid():
    cd = form.cleaned_data
    pending_schedules = my_account.my_pending_payment_schedules(
        country=cd.get('country', None),     
        institution=cd.get('institution', None)
    )

c = RequestContext( request, {
    'form': form,
    'pending_schedules': pending_schedules,
})

return render_to_response(
    'my/approvals/approvals_index.html', 
    context_instance=RequestContext(request, c)
)

模板

{% for sample in pending_schedules %} 

案例#2:传递多个值的参数

但是,如果我们试图遍历多个用户的待处理日程表,每个日程表都需要不同的参数,我们就不能使用简单的“pending_schedules”变量。

我们必须将该变量转换为字典以存储多个用户的结果。

我的同事开发了一个模板标签,允许您在循环循环时按键访问字典。

Templatetags

@register.filter
def hash(obj, key):
    """return hash lookup of key in object

    If the key can be hard-coded into the template, then the normal dot-notation
    is sufficient (obj.key). But if the key is referenced by a name in the
    template context then this hash filter becomes useful.

    Template usage: obj|hash:key
    """
    return obj[key]

模板:

    for user in users: 
        for sample in pending_schedules|hash:user.id 
            Do something

        endfor 
    endfor