1

ユーザーがテンプレートのフォームから DB レコードを編集できるビューを作成しようとしています。これらのビューの作成方法を教えている多くの Web ページ (および Django ドキュメントも) を検索しましたが、それらは常に Django がモデルごとに生成する「id」を使用します。この特定のモデルでは、AutoField を使用して「id」をオーバーライドする必要があります。この AutoField を Django でレコードの「id」として使用する方法はありますか?

これが私の完全なモデルです:

class T031003 (models.Model): 
   C003IDCD = AutoField(primary_key=True)
   C003INST = models.IntegerField(unique=True) #usar AutoSlug
   C003TPCD = models.CharField(max_length=1)
   C003CHCD = models.CharField(max_length=14)
   C003MTR = models.CharField(max_length=30, blank=True, null=True)
   C003CTCD = models.CharField(max_length=3)
   C003RZSC = models.CharField(max_length=60, blank=True, null=True)
   C003EML = models.EmailField(max_length = 254, blank=True, null=True)
   C003LOGA = models.CharField(max_length=20)
   C003LOGB = models.DateTimeField()
   C003LOGD = models.CharField(max_length=15, blank=True, null=True)
   C003LOGF = models.CharField(max_length=20, blank=True, null=True)

   def __unicode__(self):
       return '%s' %  self.C003MTR

   class T031003Form(ModelForm):
       class Meta:
          model = T031003
          ordering = ["-C003MTR"]
          exclude = ('C003LOGA','C003LOGB','C003LOGD','C003LOGE','C003LOGF')

そして、これが私がやろうとしたビューですが、「T031003は指定されたクエリに一致しません」というエラーが表示されます。テーブルに「id」がないため、そのとおりです。

def t031003form_edit(request, id=None):
pin = get_object_or_404(T031003, pk=id)
form = T031003Form(request.POST or None, instance=pin)
if request.method == 'POST':
    if form.is_valid():
        form = form.save(False)
        form.C003LOGA = request.user
        form.C003LOGB = datetime.date.today()
        form.C003LOGD = request.META['REMOTE_ADDR']
        form.C003LOGF = request.META['USERDOMAIN']
        form.save()
        form = T031003Form()
    else:
        return HttpResponseRedirect('/erro/')
return render_to_response('T031003Form_edit.html', {'form': form,}, context_instance=RequestContext(request))

どんな助けでも大歓迎です!

4

2 に答える 2

0

モデルにAutoField(自動インクリメントの主キー)がある場合、その自動インクリメントされた値が計算され、save()を初めて呼び出したときにオブジェクトの属性として保存されます。

>>> b2 = Blog(name='Cheddar Talk', tagline='Thoughts on cheese.')
>>> b2.id     # Returns None, because b doesn't have an ID yet.
>>> b2.save()
>>> b2.id     # Returns the ID of your new object.

save()を呼び出す前に、IDの値がどうなるかを知る方法はありません。その値は、Djangoではなくデータベースによって計算されるためです。

参照:https ://docs.djangoproject.com/en/dev/ref/models/instances/?from = olddocs

于 2012-06-12T16:51:37.377 に答える
0

親しい友人の助けのおかげで、フォームセットを使用してトリックを行うことができました。ビューは次のとおりです。

def t031002form_edit(request, id_auto):
j = get_object_or_404(T031002, pk=id_auto)

T031003FormSet = modelformset_factory(T031002, can_delete=True, max_num=1)

if request.method == 'POST':
    form = T031002FormSet(request.POST or None, request.FILES or None, queryset=T031002.objects.filter(pk=id_auto)) 
    if form.is_valid():
        instance = form.save(commit=False)
        form.C003LOGA = request.user
        form.C003LOGB = datetime.date.today()
        form.C003LOGD = request.META['REMOTE_ADDR']
        form.C003LOGF = request.META['USERDOMAIN']
        for reform in instance:
            reform.save()
    else:
       return HttpResponseRedirect('/erro/')
else:
    form = T031002FormSet(queryset=T031002.objects.filter(pk=id_auto))  
return render_to_response(('T031002Form_edit.html'), {'form': form,}, context_instance=RequestContext(request))

そのため、フォームセットを使用すると、うまく作業でき、心配する必要はありません。この同じ質問で他の人に役立つことを願っています。

于 2012-06-17T07:37:29.650 に答える