将请求信息传递给模型类方法的最佳方法是什么?
我想知道我的逻辑是否在错误的地方。也许我需要将它从我的模型中移出。
我希望能够传递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
答案 0 :(得分:3)
是的,我会说你的逻辑是在错误的地方。我不知道你试图传递给myPendingPaymentSchedules
的价值来自何处,但它似乎应该在视图而不是模板中完成。然后,您可以将生成的计划直接传递到模板上下文中。
(顺便说一句,你的命名方案不是非常Pythonic:我使用my_account
和my_pending_payment_schedules
- 请参阅PEP8。
答案 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 %}
但是,如果我们试图遍历多个用户的待处理日程表,每个日程表都需要不同的参数,我们就不能使用简单的“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