0

私は信じている単純な問題について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)

しかし、ここでもフォームは検証されません。何が間違っているのかわからない!

4

0 に答える 0