私は信じている単純な問題について2日間頭を悩ませています!
単純なモデル:
class CryptoOptions(models.Model):
setting_name=models.CharField(max_length=100)
dictionary=models.TextField()
alphabet=models.TextField()
criteria_types = (('ASCII', 'ASCII set'),
('EN', 'English language'),
('CUSTOM', 'Custom criteria'),
)
criteria=models.CharField(max_length = 32, choices=criteria_types, default='ASCII')
operation_types = (('xor', 'XOR'),
('ror', 'Rotation Right'),
('rol', 'Rotation Left'),
('shiftl', 'Shift Left'),
('shiftr', 'Shift Right'),
('rot13', 'Rotation 13'),
('base64', 'Base 64')
)
operation = models.CharField(max_length = 32, choices=operation_types, default='xor')
def __unicode__(self):
return u'%s' % (self.setting_name)
シンプルなモデルフォーム:
class CryptoOptionsForm(ModelForm):
optionid= forms.ModelChoiceField(queryset=CryptoOptions.objects.all(),initial=0)
class Meta:
model = CryptoOptions
fields = ['dictionary', 'alphabet', 'criteria','operation']
ビューで:
xoratorForm=None
if request.method == 'POST':
if 'optionid' in request.POST:
if request.POST['optionid'].isdigit():
defaultOption=CryptoOptions.objects.get(pk=int(request.POST['optionid' ]))
xoratorForm=CryptoOptionsForm(instance=defaultOption)
xoratorForm.fields['optionid'].initial=int(request.POST['optionid'])
if xoratorForm.is_valid():
print "Valid"
print xoratorForm.cleand_data
else:
print "Errors"
print xoratorForm.errors
request.POST は完全に満たされています:
<QueryDict: {u'dictionary': [u'Windows\r\nCopyright\r\nSystem32'], u'alphabet': [u'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'], u'optionid': [u'1'], u'criteria': [u'ASCII'], u'csrfmiddlewaretoken': [u'QsSHIMhYgANR0a5a1FJ9gCLey5DcAINp'], u'operation': [u'xor']}>
DjangoForm も値で満たされているようです。
ここで何が起こっているのかわかりません。デバッグする方法はありますか?
他の方法は次のように機能します。
defaultOption=CryptoOptions.objects.get(pk=int(request.POST['optionid' ]))
print defaultOption
#xoratorForm=CryptoOptionsForm(instance=defaultOption)
#xoratorForm.fields['optionid'].initial=int(request.POST['optionid'])
xoratorForm=CryptoOptionsForm(request.POST,instance=defaultOption)
しかし、フォームを送信されたフォームではなく defaultOption から変更したいので、それは私の意図した目的ではありません。おそらく、複数選択フィールドを含むオブジェクト全体ではなく、Meta オブジェクトを渡すという事実が気に入らないのでしょうか?
私はジャンゴ初心者です!
今日の最後の発見は、そのような方法でメソッドをオーバーライドしようとしていました:
class CryptoOptionsForm(ModelForm):
optionid= forms.ModelChoiceField(queryset=CryptoOptions.objects.all(),initial=0)
class Meta:
model = CryptoOptions
fields = ['dictionary', 'alphabet', 'criteria','operation']
def __init__(self, *args, **kwargs):
if kwargs.get('instance'):
print "Instance INIT"
if isinstance(kwargs['instance'],CryptoOptions):
object = kwargs['instance']
kwargs.setdefault('initial', {})['optionid'] = object.pk
kwargs.setdefault('initial', {})['model'] = object
else:
print "POST INIT"
print kwargs
return super(CryptoOptionsForm, self).__init__(*args, **kwargs)
しかし、ここでもフォームは検証されません。何が間違っているのかわからない!