2

状況: 既存の mysql データベースにいくつかのデータが含まれています。この例では、2 つのフィールドのみを使用します。idsubjectidは *auto_increment* オプション付きの整数として定義されますが、subjectは単なる通常の varchar です。コード:

モデル:

class AList(models.Model):
    id=models.AutoField(primary_key=True, db_column='ID')
    subject=models.CharField(max_length=200, db_column='SUBJECT')
    class Meta:
        db_table = u'alist'

フォーム:

class AForm(ModelForm):
    class Meta:
        model=AList

ビュー:

def alistForm(request,a_id=None):
    if a_id:
        a=AList.objects.get(id=a_id)
        form=AForm(instance=a)
    else:
        form=AForm(request.POST or None)
    return render_to_response('aform.html',{'form':form},context_instance=RequestContext(request)

def alistPost(request):
    form=AForm(request.POST or None)
    if form.is_valid():
        form.save()

問題の説明: フォームが alistPost 関数に新しいデータを送信すると、form.save()が新しいレコードを挿入します。しかし、既存のレコードを編集すると、それも新しいレコードとして挿入され、更新されません。

id をAutoFieldからIntegerFieldに変更しようとすると、動作が変わります。レコードを変更すると、form.save()が既存のレコードを変更し、新しいレコードを挿入しようとすると、id がないために失敗します。

質問: データベースから新しい ID 値を手動で取得し、Django がこの新しいレコードにそれを使用するように強制する必要がありますか? または Django が INSERT または UPDATE を使用する必要があるかどうかを自動的に判断する方法はありますか?

4

3 に答える 3

4

ドラグーンは正しい軌道に乗っていますが、あなたのコメントは有効です。より良いパターンは次のようなものです:

if a_id:
    a = AList.objects.get(id=a_id)
else:
    a = AList()
if request.POST:
    form = AForm(request.POST, instance=a)
    ...
else:
    form = AForm(instance=a)
于 2011-10-19T12:44:10.030 に答える
1

これは私がしたことです:

def someView(request,id=None):
   instance = form = None

   ...
      ...
   elif request.method == 'POST':

        if id != None:
            instance = SomeClass.objects.get(id=id)
            form = AForm(request.POST,instance=instance)
        else:
            form = AForm(request.POST) 

        if form.is_valid():

           instance = form.save()
           if not id:
               return redirect('edit',id=instance.id)
        else
            ...
        ...

URL:

url(r'^addedit/$', 'som.views.someView', name='edit'),
url(r'^addedit/(?P<id>.*)/$', 'som.views.someView', name='edit'),

オブジェクトが /addedit/ に作成された後、ユーザーは /addedit/1234/ にリダイレクトされます

于 2011-12-19T20:14:58.137 に答える
0

問題は、フォームに引数を指定しない 別の関数で POST を実行していることです。instance

次のように関数を 1 つにマージしてみてください。

def alistForm(request, pk)
    alist = get_object_or_404(AList, pk=pk)
    form = AFrom(request.POST or None, instance=alist)
    if request.method == 'POST':
        if form.is_valid():
            form.save()
    ...
于 2011-10-19T11:31:15.327 に答える