与this类似,但解决方案对我不起作用。
基本上,我正在尝试这样做:
if request.method == 'POST':
profile_form = UserProfileForm(request.POST)
# ...
else:
profile_form = UserProfileForm(request.GET)
然后表格在GET上得到验证。使用initial=request.GET
代替不起作用,因为每个条目都是列表而不是字符串。即,如果我尝试转到myform?company=mycompany
,则mycompany
字段设置为[u'mycompany']
。
是否存在绕过验证的不同方法,或者是否有一种简单的方法可以将querydict
转换为常规字典(没有列表)?
答案 0 :(得分:2)
您可以将request.GET
转换为字典,其值不是这样的列表:
initial = dict(map(lambda x:(x[0], x[1][0]), dict(request.GET).items()))
profile_form = UserProfileForm(initial=initial)
这将获取每个列表中的第一个项目,这意味着只有当您的所有输入都有不同的名称(他们应该或您没有做正确的事情)时它才会起作用。如果有效,请告诉我。
您可能不需要dict(request.GET).items()
,您可以放置request.GET.items()
。
答案 1 :(得分:1)
Bah ...如果表单上有前缀,Bryce的解决方案将无效。我们不得不削减它:
def initdict(querydict, prefix=None):
if prefix is None:
return querydict.items()
p = prefix + '-'
l = len(p)
return dict((k[l:],v) for k,v in querydict.iteritems() if k.startswith(p))
用法:
profile_form = UserProfileForm(prefix='profile', initial=initdict(request.GET, prefix='profile'))
答案 2 :(得分:1)
虽然您似乎已经找到了解决方案,但为什么不使用继承自UserProfileForm的表单类,如NoValidationUserProfileForm?在这种情况下,您可以遍历所有字段以设置required = False
。
class NoValidationUserProfileForm(UserProfileForm):
def __init__(self, *args, **kwargs):
super(NoValidationUserProfileForm, self).__init__(*args, **kwargs)
self.fields['myfield'].required = False