Django:绕过表单验证?
类似于,但那里的解决方案对我不起作用 基本上,我正在尝试这样做:Django:绕过表单验证?,django,django-forms,Django,Django Forms,类似于,但那里的解决方案对我不起作用 基本上,我正在尝试这样做: if request.method == 'POST': profile_form = UserProfileForm(request.POST) # ... else: profile_form = UserProfileForm(request.GET) 但是表单会在GET上得到验证。使用initial=request.GET也不起作用,因为每个条目都是列表而不是字符串。i、 例如,如果我尝试转到my
if request.method == 'POST':
profile_form = UserProfileForm(request.POST)
# ...
else:
profile_form = UserProfileForm(request.GET)
但是表单会在GET上得到验证。使用initial=request.GET
也不起作用,因为每个条目都是列表而不是字符串。i、 例如,如果我尝试转到myform?company=mycompany
,mycompany
字段设置为[u'mycompany']
有没有其他方法可以绕过验证,或者有没有一种简单的方法可以将
querydict
转换为常规dict(没有列表)?您可以将请求。将转换为包含非列表值的字典,如下所示:
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()
放入。。。如果表单上也有前缀,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'))
尽管您似乎已经找到了解决方案,为什么不使用从UserProfileForm继承的form类,比如NoValidationUserProfileForm?在这种情况下,您可以在所有字段上循环设置required=False
class NoValidationUserProfileForm(UserProfileForm):
def __init__(self, *args, **kwargs):
super(NoValidationUserProfileForm, self).__init__(*args, **kwargs)
self.fields['myfield'].required = False
哈!它起作用了,但后来只尝试了request.GET.items()
,它只给了我每个项目的第一个字母,这表明它们不再是列表,而是字符串。结果是initial=request.GET.items()
按原样工作。你可以有+1,但这似乎是一项更大的工作。我不同意。我认为它更具可读性。重写uuu init_uuuuuu()不一定是黑客行为。不。。。不是覆盖的\uuuu init\uuuu
,而是需要每个表单的第二个版本,并禁用所需的
,以避免显示一些错误消息。