2012-01-18 10 views
2

プライマリキー 'id'を使用して 'identification'というフィールドを設定しようとしています。しかし、あなたが知っているように、オブジェクトが保存される前にどんな「id」があるかを知る方法はありません。そのため、頑固に私はこれをしなかった:面白いことに、これはコンソールで動作 self.idを使用してDjangoの他のフィールドを設定する

def save(self, *args, **kwargs): 
    super(Notifications, self).save(*args, **kwargs) 
    self.identification = str(self.id) 

{% for each in notifications %} 
    Identification: {{ each.identification }} 
{% endfor %} 

現実のストライキ:

>>>new = Notifications.objects.create(# some fields to be filled) 
>>>new.identification 
'3' (# or whatever number) 

を私は、このオブジェクトを取得するために私のテンプレートに行くとき:

Identification: 

何が起こっていますか?なぜコンソールでは動作しますが、テンプレートでは動作しませんか?他のフィールドで自動入力フィールドを使用するには、どのようなアプローチをお勧めしますか。

ありがとうございます!

+0

なぜ好きではないですか? – Caspar

+0

親のために1、子供のために1.1,1.2など、子供の子供のために1.1.1などを使用してネストされたコメントを実装すること。それはjoomlaが使用するシステムです。 –

答えて

3

問題は、データベースに変更を保存していないことです。

この特定のモデルインスタンス(Pythonオブジェクト - 非常に一時的)はidentificationというプロパティを持っているため、端末で動作します。ビューまたはテンプレートでアクセスすると、save()メソッドが呼び出されていないので、プロパティ/フィールドは空白です。

これを機能させるには、最初の保存後にsaveを再度呼び出します。また、モデル作成時にのみidを設定することも意味があります。ほとんどの場合、最初の保存ごとに1回の追加通話はそれほど大きな取引ではありません。

def save(self, *args, **kwargs): 
    add = not self.pk 
    super(MyModel, self).save(*args, **kwargs) 
    if add: 
     self.identification = str(self.id) 
     kwargs['force_insert'] = False # create() uses this, which causes error. 
     super(MyModel, self).save(*args, **kwargs) 
+0

あなたの答えをありがとう。まあ、はい、私はそれが問題だと思いました。私が再度保存しなければならないと言うと、save()(変更なし)を使用した後、私が望むように識別値を満たすオブジェクトを取得します。 –

+0

@RobertSmith:どのようにスライスしても、モデルへの変更を何とかデータベースに保存する必要があります。 1つの方法は、自動生成されたIDを決定した後にsave()を再度呼び出すことです(更新された投稿)。私はそれがにおいをするのが好きではありませんが、なぜそれが問題を引き起こすのか分かりません。これはあなたのボトルネックではありません。多分。 –

+0

ところで、スニペットのおかげで。確かに、非常に便利です。 –

関連する問題