2012-03-03 32 views
1

現在、私は最初のDjangoプロジェクトに取り組んでおり、ImageFieldを既存のモデルに追加することに関しては、ロードブロッキングを打ちました。ImageFieldをDjangoモデルに追加するとエラーが発生する

私は現在、ユーザー投稿用のモデルとdjango-profiles用のモデルを持っています。前者の場合、ImageFieldを追加して、使用者はテキストコンテンツに付随する写真を提出することができます。後者の場合、ユーザーがプロフィール写真をアップロードできるようにしたい(アバターのサイズ変更について現時点では心配していない)。

ImageFieldを両方のモデルに追加するまではうまくいきました。私はその後、南部とデータベースを同期させました。どのような結果、私はプロファイルに一度働いてテンプレートをプルアップしてみません:

「はそのようなコラム:report_userprofile.profile_pic」提出されたテキストコンテンツを視聴しようとすると、同様のエラーが発生し

フィールドを両方とも "blank = True"に設定すると、イメージファイルを持たないかのように見えるため、エラーは発生しません。私は明らかに間違っています。

私は当初、これらのフィールドをモデルに入れていませんでしたが、それは後見で大きな間違いでした。次のように私もちょうどMEDIA_ROOTとMEDIA_URLを設定している:

MEDIA_ROOT = 'os.path.join(BASE_DIR, "media")' 

MEDIA_URL = 'http://localhost:8000/media' 

私が今使っている機種は以下のとおりです。

class Story(models.Model): 
title = models.CharField(max_length=100) 
topic = models.CharField(max_length=50) 
copy = models.TextField() 
author = models.ForeignKey(User) 
zip_code = models.CharField(max_length=10) 
latitude = models.FloatField(blank=False, null=False) 
longitude = models.FloatField(blank=False, null=False) 
date = models.DateTimeField(auto_now=True, auto_now_add=True) 
pic = models.ImageField(upload_to='pictures', blank=True) 
def __unicode__(self): 
    return " %s" % (self.title) 

class UserProfile(models.Model): 
user = models.ForeignKey(User, unique=True) 
first_name = models.CharField(max_length=25) 
last_name = models.CharField(max_length=35) 
email = models.EmailField() 
birth_date = models.DateField(blank=True, null=True) 
city = models.CharField(max_length=25) 
state = models.CharField(max_length=20) 
zip_code = models.CharField(max_length=10) 
profile_pic = models.ImageField(upload_to='pictures', blank=True) 

次のようにURLのファイルが設定されています

url(r'^admin/', include(admin.site.urls)), 

(r'^media/(?P<path>.*)$', 'django.views.static.serve', 
    {'document_root': settings.MEDIA_ROOT}, 

ここでの中核的な問題は、エラーがどのようなものか分かりません(以前のテンプレートでさえ?)。あるいは、私がいくつか作ったと確信しているので、エラーはより良いです。それは今や苦痛と一緒に少しスープです。

FYIと同じように、私はPILをインストールしました。

このような状況を改善するために必要なことについては、何の洞察も、小さな洞察力でさえ、感謝の余地があります。私は同様の問題を探してきましたが、この特定の問題はありません。 (最初のレッスンでは、当初モデルを組み立てるときに明らかにImageFilesを設定することになります)。

ありがとうございました。

答えて

3

これは、データベースに存在しない列を追加した場合(syncdbはデータベース列を更新しない場合)とまったく同じです。

これはdjango southに関する質問であれば、それをタグに追加し、失敗したsouthで行ったことの背景を追加する必要があります。

これは南のための簡単な操作でなければなりません:

  1. コメントアウトのImageField
  2. 実行python manage convert_to_south myapp(またはmanage.py schemamigration myapp --initial、その後、その後、python manage migrate myapp --fake
  3. コメントを解除のImageField。
  4. 実行python manage schemamigration myapp --auto
  5. 実行

あなたはそれはあなたが2つの他のオプションを持っている南ずに動作するようにしようとしている場合は...

手動でデータベースに列を追加したり、データベースをリセットテーブルmanage.py reset myapp - すべてのデータを削除します。あなたがpython manage.py sqlall myappコマンドを実行する場合は手動でDBを変更する

は非常に簡単です - それは、テーブルを構築するために使用されるSQLの一覧が表示されますので、あなたの場合、sqlite3の中で(python manage.py dbshellセッションに欠落しているフィールドラインをコピーして貼り付けることができます)キー・パーツをalter table文に変換するとします。

0

クラス構造を変更した場合は、クラスを変更したことを反映するためにデータベースを再構築するか、データベーステーブルを変更する必要があります。エラーは、問題の内容を正確に伝えています。列がテーブルにありません。 syncdbはそれをしません。これを行う最も簡単な方法は次のとおりです。

manage.py reset table_name 

table_nameは{app} _ {class}です。これにより、現在のすべてのデータが削除されます。データを変更する場合は、使用しているデータベースシェル内でデータを変更する必要があります。

+0

ありがとうございました。これで、 "Story"クラス全体がリセットされ、空のままになります(これは問題ありません)。私はsqlite3を使用していると私はそれがデータベースモデルを変更するためにサウスを使用すると面倒かもしれない聞いたことがある。他に明白な誤りがあったのでしょうか?私は何とか私は(私がこれらの変更を開始した順序のように)私がねじれたほどのものがあると感じています。 –

+0

他にどんな危険が潜んでいるかは分かりません。私はまた、あなたが間違っていたことを推測するために十分な経験を南に持っていません。マイグレーションが適切に管理されていなかったことははっきりしています。 –

関連する問題