【发布时间】:2016-06-05 15:14:28
【问题描述】:
我有许多 django 表单,我将请求作为 kwarg 传递。
我刚刚开始深入测试,似乎需要请求作为参数的测试表单使测试变得更加困难。因为我必须以某种方式创建一个请求,没有它我无法测试我的表单。
那么最好完全避免将请求传递给表单吗?还是另一种解决方法? 我首先这样做的原因是有时我需要 request.user 或 request.session 并根据表单中的信息进行一些清理/设置。
更新:
这是一个示例表单:
class OrderForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
self.request = kwargs.pop('request')
self.user = self.request.user
def clean(self):
# Here I have some cross session-field validation
if self.request.session['has_response'] and self.cleaned_data('status') == 'NEW':
raise ValidationError()
def save(self, commit=False):
self.instance.user = self.user
return super(OrderForm, self).save(commit=True)
class Meta:
model = Order
fields = ('address', 'city', 'status', ) # more fields
查看代码很简单:
form = OrderForm(request.POST, request=request)
Order 模型还有一个带有一些验证逻辑的 clean() 方法。 会话最多在用户登录期间填充。 我需要那里的会话/用户。
但最重要的问题是 - 将请求和会话传递给表单,考虑测试此表单的选项,这是一个糟糕的设计吗?当表单负责保存对象(包括 request.user)时,我发现它更合乎逻辑。但也许我应该尝试在表单和视图之间拆分它?
【问题讨论】:
-
你能举个例子吗?默认情况下,render() 将使用 RequestContext 作为 context_instance。
-
更新了一个与我的大多数表单行为非常匹配的表单。
-
查看我最近更新的设置会话。
标签: django forms testing request keyword-argument