0

フィールドの 1 つに対して生成されたランダムな値を持つフォームを保存しています。null になることができる manyToMany 関係もあります。私が達成したいのは、生成時にフォームを保存し、後で取得して更新することです。

管理コンソールでフォームを保存すると、モデルのすべてのフィールドに null=True と blank=True があるため、フォームに何も追加せずに保存できます。

ビュー.py

def event(request):
    if request.POST:
        form = EventForm(request.POST)
        if form.is_valid():
            form.save()
            del request.session['event_id']
            return HttpResponseRedirect('....')
    else:
        event_session = request.session.get('event_id')
        if event_session is not None:
            event_instance = EiEventType.objects.get(eventID = event_session)
            form = EiEventForm(instance=event_instance)
            form.save(force_update=True)
        else:
            form = EventForm()
            form.save()
            request.session['event_id'] = form['eventID'].value()
    args = {}
    args.update(csrf(request))
    args['form'] = form
    return render_to_response('.....',args)

新しいフォームインスタンスを作成するときにelseコードでform.is_validを試してみましたが、if条件自体には入りません(コードには記載されていませんが)。

現在のコードでは、エラーが返されます。「EventFormオブジェクトにはCleaned_data属性がありません」がデータベースに保存されます..フォームに何もせずに投稿(request.POST)すると、問題なく保存されますが、なぜそうなのか理解できませんか?

更新: forms.py

class EventForm(forms.ModelForm):
    class Meta:
        model = EiEventType

models.py

class Event(models.Model):
    eventID = models.CharField(null=True,blank=True,default=random_eventID)
    start = models.DateTimeField(null=True, default=two_min_from_now)
    signal = models.ManyToManyField(Signal,null=True)
    ...
    ...
    ...

ランダム関数は次のように定義されます。

def random_eventID()
    return "event_" + str(uuid.uuid4())[:5]

def two_min_from_now()
    return datetime.datetime.now() + timedelta(minutes=2)
4

2 に答える 2

0

form.save()最初に を呼び出さない限り、呼び出すことはできませんform.is_valid()

于 2013-10-16T19:38:34.600 に答える
0

フォームにデータがバインドされていない form.save() メソッド呼び出しがあります。

    else:
        form = EventForm()
        form.save()
        request.session['event_id'] = form['eventID'].value()

したがって、モデルフォームであるため、クリーンアップされたデータを探しますが、存在しません。

于 2013-10-16T19:53:04.777 に答える